【问题标题】:How to call a trait method without a struct instance?如何在没有结构实例的情况下调用 trait 方法?
【发布时间】:2020-02-02 03:39:49
【问题描述】:

如果我有一个没有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
}

编译器给出错误“unresolved name 'SomeStruct::one_trait.'”

如何直接调用 struct 的 trait 方法实现?

【问题讨论】:

  • (这不是一个精确重复,但它肯定涵盖了相同的领域,并且在 UFCS 出现之前,如果没有变通方法,你根本无法做到这一点的答案是正确的。)
  • “不编译”变量的错误信息是什么? (最好包含精确的编译器输出,这样每个人都在完全相同的页面上。:))
  • 当然。我将编辑问题以添加编译器错误。
  • 克里斯的回答仍然成立。目前不可调用(直到 UFCS 登陆)

标签: rust


【解决方案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

【讨论】:

    【解决方案2】:

    我相信这目前是不可能的。问题是您不能明确指定 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&lt;T&gt; 的大小为零。

    【讨论】:

    • @PureW:RFC 已被拒绝,因此文件被删除:x
    猜你喜欢
    • 1970-01-01
    • 2021-01-07
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 2015-08-05
    相关资源
    最近更新 更多