我是 Rust 的新手,我正在尝试了解该语言的基础知识。
考虑以下特征
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));
}
}
有没有更好/不那么冗长的方法?我可以解决将实例包装在 a 中的问题Box
吗?在这种情况下,特征对象的要点是什么?