我是一名 Rust 的新手,正在尝试了解该语言的基础知识。
考虑以下 trait
trait Function {
fn value(&self, arg: &[f64]) -> f64;
}
以及两个实现它的结构体:
struct Add {}
struct Multiply {}
impl Function for Add {
fn value(&self, arg: &[f64]) -> f64 {
arg[0] + arg[1]
}
}
impl Function for Multiply {
fn value(&self, arg: &[f64]) -> f64 {
arg[0] * arg[1]
}
}
在我的main()
函数中,我想要将两个Add
和Multiply
实例分组到一个向量中,然后调用value
方法。以下代码可以实现:
fn main() {
let x = vec![1.0, 2.0];
let funcs: Vec<&dyn Function> = vec![&Add {}, &Multiply {}];
for f in funcs {
println!("{}", f.value(&x));
}
}
同样如此的还有:
fn main() {
let x = vec![1.0, 2.0];
let funcs: Vec<Box<dyn Function>> = vec![Box::new(Add {}), Box::new(Multiply {})];
for f in funcs {
println!("{}", f.value(&x));
}
}
有没有更好/更简洁的方法?我能否避免将实例包装在Box
中?在这种情况下,特质对象的要点是什么?