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

seb*_*ssa 2 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() {}
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

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

真正的情况是更复杂一点,但我想解释run的是T实现HasName特质.

She*_*ter 7

因为您已经定义了关联的函数,而不是方法 - 没有self参数.

要么你想要

fn run(arg: T) {
    println!("{}", T::name());
} 
Run Code Online (Sandbox Code Playgroud)

或者你想要的

trait HasName {
    fn name(&self) -> String;
}
Run Code Online (Sandbox Code Playgroud)

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