动态

详情 返回 返回

rust學習二十.7、RUST完全限定名以及靜態方法 - 动态 详情

rust中看不到java等一些OOP語言的中用於修飾方法的static之類的關鍵字眼。

注:rust有static關鍵字,目前是用於修飾生命週期的或者是變量的

例如:

let leaked_str: &'static str = Box::leak(tmp.into_boxed_str());
static mut SIGN: u32 = 0;
 
先給出完全限定語法:
<Type as Trait>::function(receiver_if_method, next_arg, ...);
 
為什麼需要這個語法,直接原因是:特質和實現特定特質的類型中都存在同樣的方法,必須通過完全限定的方式告訴Rust執行哪個方法。
 

一、例子

本例對於書上的例子稍微進行了改造.

trait Fight{
    fn fight(&self);
    fn rest();
}

struct Student{
    name:String
}
impl  Student{
    /**
     * fight是關聯函數,因為它帶有self參數,所以不能直接調用特質中的同名方法,
     * 必須通過實例調用
     */
    fn fight(&self){
        println!("{} 在獨鬥.十步殺一人,千里不留行", self.name);
    }
    /**
     * rest是靜態方法,不是關聯方法,可以直接通過類型調用
     * 所以不能通過實例調用,只能通過類型調用
     */
    fn  rest(){
        println!("休息一下");
    }
}
impl Fight for Student{
    fn fight(&self){
        println!("{} 在團戰.", self.name);
    }
    fn rest(){
        println!("大家休息一下");
    }
}

fn main() {
    let stu = Student{name:"小明".to_string()};
    // 三種調用方式,調取不同的方法
    // 1.實例後跟上方法
    // 2.特質名::方法(&實例)
    // 3.<Type as Trait>::function(receiver_if_method, next_arg, ...);

    stu.fight();//1.實例跟上方法
    Fight::fight(&stu);   //2.特質名::方法(&實例) -- 實際是調用特質的方法
    <Student as Fight>::fight(&stu);  //3.特質名::方法(&實例) -- 實際是調用對象實例的方法

    Student::rest();  //4.類型的靜態方法
    <Student as Fight>::rest();
}

在本例中有一個類型Student和一個特質Fight.

Student和Fight都有方法fight和rest,其中rest是無參數。Student.reset本質上就是一個類型Student的靜態方法,即使不實例化也可以調用。

看運行結果:

 

二、小結

1.rust的類型可以有靜態方法,不需要實例化即可執行,但是rust並沒有使用類似static之類的修飾符明顯指出

2.rust可以通過方法的完全限定語法來確定要執行類型所實現的特質方法--如果這個名稱的方法類型自己也有一個

3.在諸如java這樣的語言中,是不允許rust這樣的-對象的方法名和接口的方法名稱一樣

4.rust這種措施,允許重名出現,但這樣反而會導致代碼難於閲讀。不清楚為什麼它要容許這個,是不是因為rust設計到一半的時候,不想重構了,於是順水推舟...

 

Add a new 评论

Some HTML is okay.