如何声明方法的参数实现特定的特征

时间:2016-03-29 13:05:39

标签: rust

无法理解我做错了:

pub trait HasName {
    fn name() -> String;
}

pub struct WorkerHandler<T: HasName> {
    arg: T,
}

impl<T: HasName> WorkerHandler<T> {
    pub fn run(arg: T) {
        println!("{}", arg.name());
    }
}

fn main() {}

这会导致错误:

error: no method named `name` found for type `T` in the current scope
         println!("{}", arg.name());
                            ^~~~~~

真实案例有点复杂,但我希望向run解释T实现HasName特征。

2 个答案:

答案 0 :(得分:7)

因为您已经定义了关联函数而不是方法 - 所以没有self参数。

要么

fn run(arg: T) {
    println!("{}", T::name());
} 

或者你想要

trait HasName {
    fn name(&self) -> String;
}

两者都是代表不同事物的有效概念。例如,关联函数对构造函数很有用。 Default trait就是一个很好的例子。

答案 1 :(得分:2)

您的name方法需要self参数:

pub trait HasName {
    fn name(&self) -> String;
}