Ответ 1
Обратите внимание, что вызов методов в признаке вместо типа, реализующего признак, позволяет сделать такие случаи однозначными: подумайте, добавили ли вы следующий код к вашему примеру:
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
, обсуждался как способ явно записать одно намерение, но я не уверен, как далека от этого.)
Обновление около 15 июля 2014 года: предложение "Синтаксис единого вызова функции" отслеживает работу, указанную в предыдущем абзаце. См. Rust RFC PR 132. Я понимаю, что UFCS, как описано в RFC, фактически позволит вам писать CookiesMonster::new
, когда Monster
является единственным признаком в области, который оба (1.) предоставляет метод new
, и (2.) однозначно реализован для CookiesMonster
.