Функция с общим ограничением типа против функции со ссылкой на объект признака. Почему один разрешен, а другой нет?

#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 /…