Следующий код не будет компилироваться из-за двух экземпляров этой ошибки:Rust Черта преобразования объекта
error[E0277]: the trait bound
Self: std::marker::Sized
is not satisfied
Я не понимаю, почему Sized
требуется в данном случае, и как &self
и &Any
являются указателями, и операция не требует знания размера структуры, которая реализует признак, она требует только знания самого указателя и типа, из которого он преобразуется, и который он будет иметь, поскольку &self
является общим, когда он реализован внутри признака.
Я думаю, что это может быть экземпляр компилятора, принуждающего к ненужным ограничениям, и я рассмотрел вопрос о проблеме с репозиторией Rust-lang GitHub, но я подумал, что, вероятно, я должен увидеть, знает ли кто-то, что я чего-то не делаю до того, как я Пойдите, файл, проблема.
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()
необходимых функций для структур, которые реализуют эту черту, но и для тех структур, реализация всегда будет точно, как показано здесь, вплоть до каждого индивидуального характера, в результате чего в ряде случаев идентичного шаблона.
Я удалил свой ответ, потому что я не могу найти ссылку на документацию достаточно быстро. Однако я понимаю, что 'Self' в чертах не имеет значения и без явной маркировки вашей черты как' Sized' компилятор увидит ее как unsized и error. –
Я думаю, что создание необходимых методов - это путь. По крайней мере, я видел эту модель раньше. Чтобы избежать дублирования кода, вы можете написать простой макрос 'impl_conversion_functions!()' Или что-то в этом роде. –