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設計到一半的時候,不想重構了,於是順水推舟...