rust語法super、self和Self

coxer發表於2024-04-02

當呼叫模組的函式時,需要指定完整的路徑。
1)use關鍵字包括範圍內的所有模組。 因此,可以直接呼叫函式,而不必在呼叫函式時包含模組。Rust中的use關鍵字縮短了呼叫函式的長度,使函式的模組在範圍內。
2)使用 * 運算子
*運算子用於將所有專案放入範圍,這也稱為glob運算子。 如果使用glob運算子,那麼不需要單獨指定列舉變數。
3)使用 super 關鍵字
super關鍵字用於從當前模組訪問父模組,它使能夠訪問父模組的私有功能。

//self
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height  //結構例項,"."
    }
}

fn foo() {}

fn bar() {
    self::foo();  //本模組,::
}

fn main() {}

//Self
trait T {
    type Item;  //關聯型別
    const C: i32;  //常量,書裡沒講,更沒在特性裡見過。說明特性可以有常量

    fn new() -> Self;  //實施者的型別

    fn f(&self) -> Self::Item;  //實施時決定
}

struct S; //空結構

impl T for S {
    type Item = i32;  //具體化
    const C: i32 = 9;  //特性裡的資料賦值

    fn new() -> Self {           // 型別S
        S
    }

    fn f(&self) -> Self::Item {  // i32
        Self::C                  // 9, 此時沒有例項,實施的是型別
    }
}


//super
mod a {
    pub fn foo() {}
}
mod b {
    pub fn foo() {
        super::a::foo(); // 父模組
    }
}
fn main() {}

//串聯
mod a {
    fn foo() {}

    mod b {
        mod c {
            fn foo() {
                super::super::foo(); // call a's foo function
                self::super::super::foo(); // call a's foo function
            }
        }
    }
}
fn main() {}

相關文章