我怎样才能拥有 Any 类型的数组?
How can I have an array of Any type?
我正在尝试为类似数据框的结构建模。我知道如何在这里使用 enum
s,但我正在探索如何使用它类似于 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,
}
}
如果你只是为了这个转换而写特征,你实际上并不需要它。
我正在尝试为类似数据框的结构建模。我知道如何在这里使用 enum
s,但我正在探索如何使用它类似于 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,
}
}
如果你只是为了这个转换而写特征,你实际上并不需要它。