簡體   English   中英

如何在沒有結構實例的情況下調用特征方法?

[英]How to call a trait method without a struct instance?

如果我有一個沒有self作為參數的方法的結構,我可以通過SomeStruct::method()調用該方法。 我似乎無法對從 trait 定義的方法做同樣的事情。 例如:

trait SomeTrait {
    fn one_trait() -> uint;
}

struct SomeStruct;
impl SomeStruct {
    fn one_notrait() -> uint {
        1u
    }
}
impl SomeTrait for SomeStruct {
    fn one_trait() -> uint {
        1u
    }
}

#[test]
fn testing() {
    SomeStruct::one_trait();   // doesn't compile
    SomeStruct::one_notrait(); // compiles
}

編譯器給出錯誤“unresolved name 'SomeStruct::one_trait.'”

如何直接調用結構的 trait 方法實現?

trait Animal {
    fn baby_name() -> String;
}

struct Dog;

impl Dog {
    fn baby_name() -> String {
        String::from("Spot")
    }
}

impl Animal for Dog {
    fn baby_name() -> String {
        String::from("puppy")
    }
}

fn main() {
    println!("A baby dog is called a {}", <Dog as Animal>::baby_name());
}

來自高級特質

我相信這目前是不可能的。 問題是您不能明確指定Self類型。 但是管道中有一個活動的RFC ,在實施時應該允許這樣做。

與此同時,你可以像這樣解決它:

trait SomeTrait {
    fn one_trait(&self) -> uint;
}

struct Static<T>;

struct SomeStruct;

impl SomeTrait for Static<SomeStruct> {
    fn one_trait(&self) -> uint { 1 }
}

fn main() {
    let type_to_uint = Static::<SomeStruct>.one_trait();
    println!("{}", type_to_uint);
}

這就是我將類型映射到整數的方式(如果這就是您所追求的)。 它是在沒有類型T的值的情況下完成的。 虛擬值Static<T>的大小為零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM