Ожидаемая структура `VecDeque<Student>` найдена структура `VecDeque<Student>` (`Student`)

Я изучаю Rust и практикую трейты и дженерики. Я сделал следующий код. Я не понимаю, почему это не работает, я имею в виду, я не понимаю, почему ошибка.

struct Student {
    name: String,
    age: u8,
    course: String
}

struct School {
    students: VecDeque<Student>
}

trait Database<T> {
    fn get_database(&self) -> &VecDeque<T>;
}

impl<Student> Database<Student> for School {
    fn get_database(&self) -> &VecDeque<Student> {
        &self.students
    }
}

The compiler points out: 
  --> src\main.rs:25:9
   |
23 | impl<Student> Database<Student> for School {
   |      ------- expected this type parameter
24 |     fn get_database(&self) -> &VecDeque<Student> {
   |                               ------------------ expected `&VecDeque<Student>` because of return type
25 |         &self.students
   |         ^^^^^^^^^^^^^^ expected type parameter `Student`, found `Student`
   |
   = note: expected reference `&VecDeque<Student>` (type parameter `Student`)
              found reference `&VecDeque<Student>` (`Student`)

Я не понимаю, что делаю неправильно, потому что self.students имеет тип VecDeque, и из метода возвращается ссылка этого типа. Спасибо!

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта строка — ваша проблема:

impl<Student> Database<Student> for School {

impl<Student> по сути то же самое, что и impl<T>. Вы объявляете параметр универсального типа под названием Student, который может быть любого типа. Остальные варианты использования Student в блоке impl относятся к этому общему типу, а не к структуре Student.

Если вы прочитаете сообщение об ошибке с таким пониманием, оно обретет смысл. Обратите внимание, что он относится к Student в impl<Student> как к параметру типа, что не то же самое, что правильный тип. В частности, эта строка:

expected type parameter `Student`, found `Student`

Компилятор сообщает вам, что он ожидал найти &VecDeque<Student>, где Student — это универсальный тип, но на самом деле он нашел &VecDeque<Student>, где Student — это структура с именем Student.

Чтобы решить проблему, просто измените impl<Student> на impl:

impl Database<Student> for School {

Это объявляет неуниверсальную реализацию Database<T> для Student, которая охватывает только случай, когда T является структурой Student.

(Детская площадка)

Другие вопросы по теме