繁体   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