При попытке лучше понять черту 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 использует эту особенность. Я не видел, чтобы это использовалось в нескольких ящиках, где я смотрел исходный код.