При попытке лучше понять черту Any
, я увидел, что имеет блок impl
для самого признака. Я не понимаю цели этой конструкции или даже если у нее есть определенное имя.
Я сделал небольшой эксперимент как с "нормальным" методом признаков, так и с методом, определенным в блоке impl
:
trait Foo {
fn foo_in_trait(&self) { println!("in foo") }
}
impl Foo {
fn foo_in_impl(&self) { println!("in impl") }
}
impl Foo for u8 {}
fn main() {
let x = Box::new(42u8) as Box<Foo>;
x.foo_in_trait();
x.foo_in_impl();
let y = &42u8 as &Foo;
y.foo_in_trait();
// y.foo_in_impl(); // error: borrowed value does not live long enough
}
Из этого ограниченного эксперимента кажется, что методы, определенные в блоке impl
, являются более ограничительными, чем методы, определенные в блоке trait
. Вероятно, есть что-то лишнее, что делает это так разблокируется, но я просто не знаю, что это такое! ^ _ ^
Разделы из языка программирования ржавчины на объектах traits и не делают упоминание об этом. Поиск самого источника Rust кажется, что только Any
использует эту особенность. Я не видел, чтобы это использовалось в нескольких ящиках, где я смотрел исходный код.