Après avoir lu this answer to "Vector of objects belonging to a trait", il semble que Rust fasse un déballage automatique. Est-ce le cas?Comment déballer des éléments contenus dans des vecteurs polymorphes?
Mon code ne compile pas et je ne comprends pas comment le code de cette réponse pourrait être compilé.
Quelle est la bonne façon de déballer les éléments d'un vecteur polymorphe, l'un contenant des traits encadrés? J'ai lu Rust by Example et the Box
documentation et je ne vois aucune méthode qui ressemble à unbox()
.
Mon code est:
trait HasArea {
fn area(&self) -> f64;
}
struct Circle {
x: f64,
y: f64,
radius: f64,
}
impl HasArea for Circle {
fn area(&self) -> f64 {
std::f64::consts::PI * (self.radius * self.radius)
}
}
struct Square {
x: f64,
y: f64,
side: f64,
}
impl HasArea for Square {
fn area(&self) -> f64 {
self.side * self.side
}
}
fn print_area<T: HasArea>(shape: T) {
println!("This shape has an area of {}", shape.area());
}
fn main() {
let c = Circle {
x: 0.0f64,
y: 0.0f64,
radius: 1.0f64,
};
let s = Square {
x: 0.0f64,
y: 0.0f64,
side: 1.0f64,
};
print_area(c);
print_area(s);
let vec: Vec<Box<HasArea>> = Vec::new();
vec.push(Box::new(c));
vec.push(Box::new(s));
for x in vec {
print_area(x)
}
}
Mon erreur est:
Compiling rustgraph v0.1.0 (file:///home/chris/lunch/rustgraph)
error[E0277]: the trait bound `Box<HasArea>: HasArea` is not satisfied
--> src/main.rs:54:9
|
54 | print_area(x)
| ^^^^^^^^^^ the trait `HasArea` is not implemented for `Box<HasArea>`
|
= note: required by `print_area`
Merci, ça marche, mais comment le 'x: Box' dans 'x.print_area();' est-il déballé? Est-ce que le déballage est automatique et où puis-je lire les règles? –
fadedbee
C'est juste un déréférencement automatique pour l'appel de méthode, c'est pourquoi rouille n'a pas à la fois les syntaxes 'obj.method()' et 'pointer-> method()', vous pouvez lire ici: https: //doc.rust-lang. org/book/deref-coercions.html – coredump