я объявил массив пользовательского признака Animal
для того, чтобы экспериментировать с полиморфизмом в Русте, но компилятор, кажется, делает вывод типа на подтипа первого элемента вместо:Почему я не могу использовать вывод типа с объявлением массива?
fn main() {
let animals = [Cat, Dog, Cat, Lion, Dog, Lion];
for single_animal in animals {
single_animal.talk();
}
}
trait Animal {
fn talk(&self);
}
struct Cat;
struct Dog;
struct Lion;
impl Animal for Cat {
fn talk(&self) {
println!("Je miaule !");
}
}
impl Animal for Dog {
fn talk(&self) {
println!("J'aboie !");
}
}
impl Animal for Lion {
fn talk(&self) {
println!("Je rugit !");
}
}
Компилятор жалуется на то, что первый элемент является Cat
, а не другие:
error: mismatched types [--explain E0308]
--> src/main.rs:3:25
|>
3 |> let animals = [Cat, Dog, Cat, Lion, Dog, Lion];
|> ^^^ expected struct `Cat`, found struct `Dog`
note: expected type `Cat`
note: found type `Dog`
error: mismatched types [--explain E0308]
--> src/main.rs:3:35
|>
3 |> let animals = [Cat, Dog, Cat, Lion, Dog, Lion];
|> ^^^^ expected struct `Cat`, found struct `Lion`
note: expected type `Cat`
note: found type `Lion`
error: mismatched types [--explain E0308]
--> src/main.rs:3:41
|>
3 |> let animals = [Cat, Dog, Cat, Lion, Dog, Lion];
|> ^^^ expected struct `Cat`, found struct `Dog`
note: expected type `Cat`
note: found type `Dog`
error: mismatched types [--explain E0308]
--> src/main.rs:3:46
|>
3 |> let animals = [Cat, Dog, Cat, Lion, Dog, Lion];
|> ^^^^ expected struct `Cat`, found struct `Lion`
note: expected type `Cat`
note: found type `Lion`
error: the trait bound `[Cat; 6]: std::iter::Iterator` is not satisfied [--explain E0277]
--> src/main.rs:4:5
|>
4 |> for single_animal in animals {
|> ^
note: `[Cat; 6]` is not an iterator; maybe try calling `.iter()` or a similar method
note: required by `std::iter::IntoIterator::into_iter`
Добавление Animal
типа в массив не решает проблему либо. Поскольку на этот раз я получаю больше ошибок:
error: mismatched types [--explain E0308]
--> src/main.rs:3:27
|>
3 |> let animals: Animal = [Cat, Dog, Cat, Lion, Dog, Lion];
|> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait Animal, found array of 6 elements
note: expected type `Animal`
note: found type `[Cat; 6]`
error: the trait bound `Animal: std::marker::Sized` is not satisfied [--explain E0277]
--> src/main.rs:3:9
|>
3 |> let animals: Animal = [Cat, Dog, Cat, Lion, Dog, Lion];
|> ^^^^^^^
note: `Animal` does not have a constant size known at compile-time
note: all local variables must have a statically known size
error: the trait bound `Animal: std::marker::Sized` is not satisfied [--explain E0277]
--> src/main.rs:4:5
|>
4 |> for single_animal in animals {
|> ^
note: `Animal` does not have a constant size known at compile-time
note: required by `std::iter::IntoIterator::into_iter`
error: the trait bound `Animal: std::iter::Iterator` is not satisfied [--explain E0277]
--> src/main.rs:4:5
|>
4 |> for single_animal in animals {
|> ^
note: `Animal` is not an iterator; maybe try calling `.iter()` or a similar method
note: required by `std::iter::IntoIterator::into_iter`
Потенциальный дубликат http://stackoverflow.com/q/27957103/155423; http://stackoverflow.com/q/25818082/155423; http://stackoverflow.com/q/36357995/155423. – Shepmaster
Я не полностью согласен с дублированием, так как вектор является динамическим использованием, а объявление массива в одной строке показывает особенности и сложности, которые являются специфическими для массива. – loloof64
Нет, ни один из ответов не относится к массиву, отличному от буквенного синтаксиса. '[& Cat as & Animal, & Dog]' и 'vec! [& Cat as & Animal, & Dog]' работают так же, как и 'let animals: [& Animal, 2] = [& Cat, & Dog]' и 'let animals: Vec <&Animal> = vec! [& Cat, & Dog] '. Кроме того, ваш вопрос [не показал никаких усилий] (http://meta.stackoverflow.com/q/261592/155423) в поисках похожих вопросов или потенциального беспокойства о том, что массив отличается от вектора. – Shepmaster