Конвертация объекта Rust Trait
Следующий код не скомпилируется из-за двух случаев этой ошибки:
ошибка [E0277]: ограничение чертыSelf: std::marker::Sized
не устраивает
Я не понимаю почемуSized
требуется в этом случае как&self
а также&Any
являются указателями, и операция не требует знания размера структуры, которая реализует признак, она требует только знания самого указателя и типа, из которого он преобразуется, в который он будет иметь, потому что&self
является общим, когда реализовано внутри черты.
Я думаю, что это может быть примером того, как компилятор навязывает ненужные ограничения, и я подумал о том, чтобы подать проблему с репозиторием GitHub от rust-lang, но я подумал, что, возможно, мне следует выяснить, знает ли кто-то здесь что-то, чего я не знаю, прежде чем подать проблему ,
use std::any::Any;
trait Component: Any {
fn as_any(&self) -> &Any {
self
}
fn as_any_mut(&mut self) -> &mut Any {
self
}
}
Альтернативой этому является сделатьas_any()
а такжеas_any_mut()
требуемые функции для структур, которые реализуют эту черту, но для этих структур реализация всегда будет точно такой, как показано здесь для каждого отдельного символа, что приводит к нескольким экземплярам идентичного шаблонного кода.