阅读 this answer to "Vector of objects belonging to a trait" 后,看起来 Rust 会自动拆箱。是这种情况吗?
我的代码无法编译,我不明白该答案的代码是如何编译的。
对包含装箱特征的多态向量的元素进行拆箱的正确方法是什么?
我读过 Rust by Example 和 the Box
documentation ,但看不到任何看起来像 unbox()
的方法。
我的代码是:
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)
}
}
我的错误是:
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`
最佳答案
您可以像 print_area(*x)
一样取消引用它,但由于其他原因它不起作用:Sized
绑定(bind)到 print_area
参数。您的函数需要知道其参数的大小。
您的代码中还有其他问题:您试图插入一个不可变的向量,并且您试图将移动的值装箱。这些在您在 print_area()
中使用后被移动了。
我的观点是让 print_area
成为一个接受不可变引用的方法会更容易。这将按您的预期工作。
trait HasArea {
fn area(&self) -> f64;
fn print_area(&self) {
println!("This shape has area of {}", self.area());
}
}
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,
};
c.print_area();
s.print_area();
let mut vec: Vec<Box<HasArea>> = Vec::new();
vec.push(Box::new(c));
vec.push(Box::new(s));
for x in vec {
x.print_area();
}
}
关于vector - 如何拆箱包含在多态向量中的元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41301239/