gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:34:47 24 4
gpt4 key购买 nike

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

我试着关注 Rust Trait object conversion但事情不起作用:

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 )。

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

最简单的解决方案是更改特征以返回装箱值(拥有的特征对象):

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,
}
}

如果您仅为此转换编写特征,则实际上并不需要它。

关于arrays - 我怎样才能拥有 Any 类型的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51603088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com