Sou muito novo no Rust, então peço desculpas se esta for uma pergunta simples!
Tenho o seguinte cenário simplificado, onde tenho uma característica e dois tipos de estrutura (TypeA e TypeB) que implementam a característica. Tenho então um vetor de características que contém instâncias de TypeA e TypeB.
Posteriormente, gostaria de iterar os campos de vetor e acesso que pertencem apenas ao TypeA ou TypeB dependendo de qual é o tipo. Abaixo está o que escrevi. Minha tentativa é combinar o tipo de cada item e, em seguida, fazer downcast do iterador de características em caixa para a estrutura. Isso funciona com uma &
referência, mas como posso conseguir uma referência mutável &mut
.
Para &
referência, considere o seguinte ...
use std::any::Any;
trait MyTrait {
fn do_something(&self);
fn as_any(&self) -> &dyn Any;
}
struct TypeA{field_a: u16}
impl MyTrait for TypeA {
fn do_something(&self) {
println!("TypeA is doing something.");
}
fn as_any(&self) -> &dyn Any {
self
}
}
struct TypeB{field_b: u16}
impl MyTrait for TypeB {
fn do_something(&self) {
println!("TypeB is doing something.");
}
fn as_any(&self) -> &dyn Any {
self
}
}
fn main() {
let vec: Vec<Box<dyn MyTrait>> = vec![
Box::new(TypeA{field_a:10}),
Box::new(TypeB{field_b:20}),
];
for item in &vec {
// Downcast the trait object to its concrete type
if let Some(type_a) = item.as_any().downcast_ref::<TypeA>() {
type_a.do_something();
print!("{}", type_a.field_a);
} else if let Some(type_b) = item.as_any().downcast_ref::<TypeB>() {
type_b.do_something();
print!("{}", type_b.field_b);
} else {
println!("Unknown type");
}
}
}
No entanto, quero modificar os campos na instância downcast, como
type_a.field_a = 100;