Eine Möglichkeit ist, einen Vektor von Any
zu verwenden (Link zur Beta, weil die stabilen docs für Any
definiert ist, nicht die Methoden zeigen, aber sie sind stabil):
use std::any::Any;
fn main() {
let mut v: Vec<Box<Any>> = vec![];
v.push(Box::new(102usize));
v.push(Box::new("Hi"));
for item in &v {
// to do an operation, it is necessary to downcast to
// a concrete type
if let Some(x) = item.downcast_ref::<usize>() {
println!("num = {:?}", x)
}
}
}
Beachten Sie, dass, im Gegensatz zu dynamic
in C#
, von dem angenommen wird, dass er jede Operation unterstützt, unterstützt ein Wert vom Typ Any
(Box<Any>
) nur die in Any
(Box<Any>
und Any
) definierten Operationen. Ein Downcast ist erforderlich, um eine Methode des konkreten Typs aufzurufen.
Ich denke, dass es nicht möglich ist, eine Art wie dynamic
von C# in Rust zu haben. Um das Aufrufen einer beliebigen Methode für einen dynamischen Wert zu unterstützen, ist eine (vollständige) Laufzeit-Reflektionsunterstützung erforderlich, die von Rust nicht bereitgestellt wird.
Wenn Sie die Methoden kennen, die aufgerufen werden, dann ist die beste Option, ein Merkmal zu definieren und Box<Trait>
zu verwenden (Any
ist in diesem Fall nicht erforderlich).
Ihre Bearbeitung würde dies zu einem Duplikat von [Was ist der beste Weg, um eine heterogene Sammlung von Objekten zu erstellen?] (Http://stackoverflow.com/questions/27957103/what-is-the-best-way-to -Erstelle-eine-heterogene-Sammlung von Objekten). – Shepmaster
Müssen Sie tatsächlich jeden Typ oder nur eine geschlossene Vereinigung von Typen zulassen (z. B. "int" oder "string")? – Lee
@Lee Irgendein Typ ... – TuxCopter