#struct #rust #traits
Вопрос:
Итак, я пытаюсь сделать шахматы внутри Rust, но столкнулся с проблемой.
У меня есть new
функция, которая точно такая же во всех моих частях (которые являются собственными структурами)… так что, очевидно, когда я это понял, я принялся за работу. У них уже была общая черта , которая гарантировала, что они все могут ее использовать movement
, поэтому я просто попытался реализовать new
функцию внутри характеристики Piece…
и после почти часа интенсивного поиска в Гугле у меня все еще нет ответа на эту головоломку.
Ржавчина просто не позволит мне создать новый объект с использованием этого Self
типа.
/// The piece trait. This guarantees that every single piece
/// can move.
pub trait Piece {
/// The movement function. Returns either an error, or a
/// vector containing the new position.
fn movement(amp;self) -> Result<Vec<usize>, anyhow::Error>;
fn new(x: usize, y: usize) -> Option<Self>
where
Self: Sized,
{
Some(Self { x, y }) // Code fails to compile here.
}
}
Ошибка компилятора:
error[E0423]: expected function, tuple struct or tuple variant, found self type `Self`
--> src/pieces.rs:19:8
|
19 | Some(Self(x, y))
| ^^^^ not a function, tuple struct or tuple variant
|
= note: can't use `Self` as a constructor, you must use the implemented struct
Комментарии:
1. Код может не совпадать с вашим кодом ошибки:
Some(Self { x, y }) // Code fails to compile here.
, но в сообщении об ошибке используются скобки (не фигурные скобки).:19 | Some(Self(x, y))
2. Вы не. Я ничего не знаю о полях. Поэтому методы признаков по умолчанию не могут использовать поля
Self
.3. Просто идея: Если к тому времени будут созданы все ваши другие типы(части)
Self { x, y }
, возможно, вам следует разработать единый тип структуры с реализованным общим поведением(новый, перемещение и т. Д.), Затем вам следует создать черты и реализовать их для отличительных особенностей4. Черта, вероятно, является неправильным способом реализации различных моделей поведения шахматных фигур, поскольку вам никогда не понадобится расширять набор реализаций. Жизнь будет намного проще с перечислением различных частей, и вам не понадобится динамическая отправка.
5. @PeterHall хорошая идея! Я постараюсь этим воспользоваться.