У меня есть две структуры, VM
и Word
. Мне нужна новая структура Control
, которая ведет себя точно так же, как VM
, но с еще одним полем master
. Поскольку у Rust нет наследования, я пытаюсь расширить структуру через композицию. Я перемещаю функции VM
в новый признак Core
и реализую Core
за Control
. Полученный код работает.Ошибка несогласованных типов при перемещении метода из реализации признака в определение признака
struct Word<T> {
action: fn(target: &T)
}
struct VM {
word: Word<VM>
}
trait Core<T> {
fn word(&self) -> &Word<T>;
fn hello(&self) { println!("Hello"); }
fn execute(&self);
}
impl Core<VM> for VM {
fn word(&self) -> &Word<VM> { &self.word }
fn execute(&self) { (self.word().action)(self); }
}
struct Control {
word: Word<Control>,
master: i32,
}
impl Core<Control> for Control {
fn word(&self) -> &Word<Control> { &self.word }
fn execute(&self) { (self.word().action)(self); }
}
fn main() {
let vm = VM{
word: Word {action: Core::hello}
};
vm.execute();
let control = Control{
word: Word {action: Core::hello},
master: 0,
};
vm.execute();
}
Две реализации execute
идентичны. Поэтому я перемещаю execute
в черту Core
.
trait Core<T> {
fn word(&self) -> &Word<T>;
fn hello(&self) { println!("Hello"); }
fn execute(&self) { (self.word().action)(self); }
}
impl Core<VM> for VM {
fn word(&self) -> &Word<VM> { &self.word }
}
impl Core<Control> for Control {
fn word(&self) -> &Word<Control> { &self.word }
}
Что компилирует со следующей ошибкой:
main.rs:14:44: 14:48 error: mismatched types:
expected `&T`,
found `&Self`
(expected type parameter,
found Self) [E0308]
main.rs:14 fn execute(&self) { (self.word().action)(self); }
Как я могу решить эту проблему?
Спасибо за исправление моего плохого английского языка , –