Я изучаю 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, и из метода возвращается ссылка этого типа. Спасибо!

Эта строка — ваша проблема:
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.