如何在没有struct实例的情况下调用trait方法?

时间:2014-08-18 01:10:16

标签: rust

如果我的结构中的方法没有self作为参数,我可以通过SomeStruct::method()调用该方法。我似乎无法使用从特征定义的方法来做同样的事情。例如:

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
}

编译器提供错误"未解析的名称' SomeStruct :: one_trait。'"

如何直接调用结构体特征方法的实现?

2 个答案:

答案 0 :(得分:1)

我认为目前这是不可能的。问题是您无法明确指定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>的大小为零。

答案 1 :(得分:1)

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());
}

来自Advanced Trait