我有以下类型:
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类型上调用新方法?
请注意,调用特征而不是实现特征的类型上的方法允许这样的情况明确:考虑是否将以下代码添加到您的示例中:
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.
| 归档时间: |
|
| 查看次数: |
1827 次 |
| 最近记录: |