Как я могу гарантировать компилятору, что тип, который я использую, является структурой с полями X и Y?

#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 хорошая идея! Я постараюсь этим воспользоваться.