Можно ли частично реализовать свойства Rust?
Нет. Либо олл-ин, либо ничего.
Но почему один код компилируется, а другой нет.
Причиной является дополнительная граница show
fn show(&self) where T: Display;
Это означает, что когда вы хотите вызвать этот метод, ваш T
должен реализовать Display
. Если это не реализовано, вы не можете вызвать его.
Рустики "дженерики" работают иначе, чем С ++, например.
В C ++ у вас есть SFINAE (Ошибка замены не является ошибкой). Это вроде утка, набирающая .
Rust работает на границах, это означает, что вы должны указать, какие черты ваш «универсальный» должен препятствовать использованию функций. В этом случае вы можете позвонить Display::fmt
, потому что вы указали, что ваш T
должен реализовать эту черту.
Эта граница не указана для вашего test
метода, и поэтому вы можете вызывать его с любым типом, который вам нужен.