Короче говоря: один может быть переопределен, а другой нет.
Когда вы определяете черту, вы определяете элементы, которые реализации (или должны) реализации черты могут переопределять:
trait Trait {
fn foo(&self) {
println!("Default implementation");
}
}
impl Trait for i64 {
fn foo(&self) {
println!("i64 implementation: {}", self);
}
}
С другой стороны, используя impl Trait
, вы определяете присущие методы, которые нельзя переопределить:
impl Trait {
fn bar(&self) {
self.foo();
self.foo()
}
}
// Try:
impl Trait for i64 {
fn bar(&self) { ... } // error: bar cannot be overridden.
}
В результате методы встроенных признаков действуют как Шаблонный шаблонный метод : они обеспечивают холст, связывающий вместе один или несколько переопределяемых методов.
Если вы посмотрите на failure
ящик, который вы связали, метод Failure::find_root_cause()
гласит:
Это эквивалентно итерации по iter_causes()
и получению последнего элемента.
Вы можете рассматривать эти присущие методы как удобные методы , методы, обеспечивающие простой / интуитивно понятный интерфейс для общих задач, которые могут выполняться вручную ... но удобно предопределены .
Примечание: любой встроенный метод может быть реализован как свободная функция, принимающая черту в качестве первого аргумента; однако свободные функции нельзя вызывать в позиции метода.