Rust中的特征和实现

And*_*osa 11 traits rust

我有以下类型:

trait Monster {
    fn attack(&self);
    fn new(int) -> Self;
}

struct CookiesMonster {
    cookies: int,
    hungry_level: int,
}

impl Monster for CookiesMonster {
    fn new(i: int) -> CookiesMonster {
        CookiesMonster { cookies: i, hungry_level: i + 1 }
    }

    fn attack(&self) {
        println!("I have {:d} cookies!!", self.cookies)
    }
}

struct Dummy {
    count: int
}

impl Dummy {
    fn new(i: int) -> Dummy {
        Dummy { count: i }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,这有效:

let monster: CookiesMonster = Monster::new(10);
let dummy = Dummy::new(10);
Run Code Online (Sandbox Code Playgroud)

但这不是:

let monster = CookiesMonster::new(10);
Run Code Online (Sandbox Code Playgroud)

为什么我不能直接在CookiesMonster类型上调用新方法?

Lil*_*ard 10

因为这就是特质目前的工作方式.必须在特征上调用特征中的静态方法,而不是在特征的实现者上调用.


pnk*_*lix 7

请注意,调用特征而不是实现特征的类型上的方法允许这样的情况明确:考虑是否将以下代码添加到您的示例中:

trait Newable {
    fn new(int) -> Self;
}

impl Newable for CookiesMonster {
    fn new(i: int) -> CookiesMonster {
        CookiesMonster { cookies: i, hungry_level: 0 }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Monster::new仍然有效,但CookiesMonster::new会含糊不清.

(在这个例子中,它的数字如何,其执行的性状使用基于类型推理.广义的语法,如Trait::<for Type>::static_method已作为一种明确写下自己的意图进行了讨论,但我不知道多远沿着这是.)

大约2014年7月15日更新:"统一函数调用语法"提案跟踪上一段中提到的工作.请参阅Rust RFC PR 132.我的理解是,RFC中描述的UFCS实际上允许你写入CookiesMonster::new何时Monster是(1.)提供new方法和(2.)明确实现的范围内唯一的特征CookiesMonster.

  • 我考虑在我的回答中提到这一点,但是一旦你开始考虑`self`的方法,这个"特征"就会消失.如果我有两个(范围内)特征都定义了`frob(&self)`那么`obj.frob()`是不明确的,即使它们来自不同的特征.所以我不相信这非常重要. (2认同)