我怎样才能拥有 Any 类型的数组?

How can I have an array of Any type?

我正在尝试为类似数据框的结构建模。我知道如何在这里使用 enums,但我正在探索如何使用它类似于 C#/Python/etc。

我尝试关注 但没有成功:

use std::any::{Any};
use std::fmt::Debug;

pub trait Value: Any + Sized {
    fn as_any(&self) -> &Any {
        self
    }

    fn as_any_mut(&mut self) -> &mut Any {
        self
    }
}

impl Value for i32 {}

#[derive(Debug)]
struct Frame {
    data: Vec<Box<Any>>,
}

fn make_int(of: Vec<i32>) -> Frame {
    let data = of.into_iter().map(|x| Box::new(x.as_any())).collect();
    Frame {
        data: data,
    }
}

编译器抱怨:

error[E0277]: the trait bound `std::vec::Vec<std::boxed::Box<std::any::Any>>: std::iter::FromIterator<std::boxed::Box<&std::any::Any>>` is not satisfied
  --> src/main.rs:40:61
   |
40 |     let data = of.into_iter().map(|x| Box::new(x.as_any())).collect();
   |                                                             ^^^^^^^ a collection of type `std::vec::Vec<std::boxed::Box<std::any::Any>>` cannot be built from an iterator over elements of type `std::boxed::Box<&std::any::Any>`
   |
   = help: the trait `std::iter::FromIterator<std::boxed::Box<&std::any::Any>>` is not implemented for `std::vec::Vec<std::boxed::Box<std::any::Any>>`

主要问题出在这个函数上:

fn as_any(&self) -> &Any {
    self
}

这意味着你可以借一个Value作为一个&Any,(它把一个&Value转换成一个&Any)。

但是,您想要从 &Any 创建一个 Box<Any>。这永远行不通,因为 &Any 是借来的值,而 Box<Any> 是拥有的。

最简单的解决方案是将特征更改为 return 盒装值(拥有的特征对象):

pub trait Value: Any + Sized {
    fn as_boxed_any(&self) -> Box<Any> {
        Box::new(self)
    }
    //The mut variation is not needed
}

现在 make_int 函数很简单:

fn make_int(of: Vec<i32>) -> Frame {
    let data = of.into_iter().map(|x| x.as_boxed_any()).collect();
    Frame {
        data: data,
    }
}

更新:稍微修改一下,我发现您可以通过编写以下内容来创建 Vec<Box<Any>>

fn make_int(of: Vec<i32>) -> Frame {
    let data = of.into_iter().map(|x| Box::new(x) as Box<Any>).collect();
    Frame {
        data: data,
    }
}

如果你只是为了这个转换而写特征,你实际上并不需要它。