代码之家  ›  专栏  ›  技术社区  ›  Gabriele

Rust:向量中结构的多态调用

  •  1
  • Gabriele  · 技术社区  · 6 年前

    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 ? 在这种情况下,trait对象的外卖是什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Peter Hall    6 年前

    有没有更好/更简洁的方法?

    dyn Function 而不是混凝土类型。编译器不能仅仅推断出你的意思 dyn函数 Add Multiply 两者都能实现。

    您无法提取对的调用 Box::new 任何一个要使其工作,您必须以某种方式映射异构集合,这在Rust中是不可能的。但是,如果你写了很多,你可以考虑为每个混凝土添加助手构造函数。 impl

    impl Add {
        fn new() -> Add {
            Add {}
        }
    
        fn new_boxed() -> Box<Add> {
            Box::new(Add::new())
        }
    }
    

    包含一个 new 尽可能使用构造函数,但包含其他方便构造函数也是很常见的。

    这使得向量的构造稍微不那么嘈杂:

    let funcs: Vec<Box<dyn Function>> = vec!(Add::new_boxed(), Multiply::new_boxed()));
    

    推荐文章