我有以下类型:
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 } } }
现在,这有效:
let monster: CookiesMonster = Monster::new(10); let dummy = Dummy::new(10);
但这不是:
let monster = CookiesMonster::new(10);
为什么我不能直接在CookiesMonster类型上调用新方法?
因为这就是特质目前的工作方式.必须在特征上调用特征中的静态方法,而不是在特征的实现者上调用.
请注意,调用特征而不是实现特征的类型上的方法允许这样的情况明确:考虑是否将以下代码添加到您的示例中:
trait Newable { fn new(int) -> Self; } impl Newable for CookiesMonster { fn new(i: int) -> CookiesMonster { CookiesMonster { cookies: i, hungry_level: 0 } } }
在这种情况下,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
.