我有以下几种:

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将是不明确的.

(在本例中,它描述了如何基于类型推断使用which实现trait.已经讨论了一种通用语法,例如Trait::<for Type>::static_method,作为一种明确记录意图的方法,但我不确定这到底有多远.)

更新时间约为2014年7月15日:"统一函数调用语法"提案追踪了上一段提到的工作.见Rust RFC PR 132.我的理解是,RFC中描述的UFC实际上允许您编写CookiesMonster::new,而Monster是范围内唯一一个两者都(1)的特征提供new方法和(2.)明确地为CookiesMonster执行.

Rust相关问答推荐

为什么导入Borrow将借入的呼叫改为Borrow::borrow而不是RefCell::borrow

如何在 struct 中填充缓冲区并同时显示它?

如果A == B,则将Rc A下推到Rc B

在执行其他工作的同时,从共享裁判后面的VEC中删除重复项

integer cast as pointer是什么意思

使用Box优化可选的已知长度数组的内存分配

为什么';t std::cell::ref使用引用而不是非空?

如何在Rust中缩短数组

为什么`tokio::main`可以直接使用而不需要任何导入?

带引脚和不带引脚的比较功能

Rust 中的内存管理

在Rust中实现Trie数据 struct 的更好方式

为什么 Rust 的临时值有时有参考性有时没有?

为什么可以在迭代器引用上调用 into_iter?

如何在 Rust 中将 UTF-8 十六进制值转换为 char?

你能告诉我如何在 Rust 中使用定时器吗?

Rust,使用枚举从 HashMap 获取值

如何构建包含本地依赖项的 docker 镜像?

如何在 Rust 的内置函数上实现特征?

如何在 Rust 的泛型函​​数中同时使用非拥有迭代器和消费迭代器?