#rust
#Ржавчина
Вопрос:
Очень многословный заголовок, но в основном мой вопрос в том, почему мне разрешено это делать:
pub fn dot<T,K>(a: amp;K, b: amp;K) -> T where K: InnerProductSpace<T> { todo!() }
но не это:
pub fn dot<T>(a: amp;dyn InnerProductSpace<T>, b: amp;dyn InnerProductSpace<T>) -> T { todo!() }
Ошибка для последнего
the trait `geometry3d::InnerProductSpace` cannot be made into an object
the trait cannot require that `Self : Sized` rustc(E0038)
Он возвращает ту же ошибку, независимо от того, использовал я dyn
ключевое слово или нет, и использую я Box
его или нет. Почему второй способ запрещен?
Комментарии:
1. Первый способ использует общие элементы, второй способ использует объекты признаков и
InnerProductSpace<T>
не является объектом безопасным. Это буквально то, что говорит вам компилятор.2. Короткий ответ
InnerProductSpace
: это небезопасно для объекта. Более длинный и подробный ответ можно найти здесь github.com/pretzelhammer/rust-blog/blob/master/posts /…