Я исправил ваш пример, чтобы вы могли найти ваше рабочее решение на этой детской площадке .
В то время как fn add<T: Add>(a: T, b: T)
имеет черту Add
для типа T
, AddStrategy
который вызывает его, не имеет той же границы черты: все что угодно (размером) может использоваться AddStrategy
. Поэтому компилятор Rust говорит вам: " Извините, но вы пытаетесь вызвать add
для чего-то, что не может быть добавлено ".
Так что Первое, что вам нужно сделать, это связать AddStrategy
с Add
:
trait AddStrategy<T: Add> { // <--- T: Add
}
И это звучит довольно хорошо, поскольку AddStrategy
собирается добавить значения.
То же самое с реализацией черты для Adder
:
impl<T: Add> AddStrategy<T> for Adder<T> { // <--- T: Add
Затем вы должны исправить Adder
, потому что он собирается сохранить выходные данные из функции add
, которая имеет тип T::Output
и Output
является типом элемента Add
черта:
struct Adder<T: Add> { // <--- Now Adder is aware about T characteristics
val: T::Output, // <--- so you can use `T::Output` from the `Add` trait
}
И так далее: в основном, определяйте черты для типов, и это позволяет вам шаг за шагом исправлять ошибки, пока вы не сделаете все явным.
Альтернатива (которая здесь не кажется полезной, но здесь вы go) состоит в том, что вместо привязки Adder
к Add
вы можете реализовать AddStrategy
тогда и только тогда, когда Adder
работает со значениями Add
: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=d83fd48f88eec68346a3d633e8a7f72c