当前位置: 首页 > 知识库问答 >
问题:

如何使用数组填充特征对象向量?

陶锋
2023-03-14

为什么下面的代码是错误的?< code >[T;N]转换为< code>Vec

trait Foo {}

struct Fooable {}

impl Foo for Fooable {}

pub fn main() {
    let bar: Vec<Box<dyn Foo>> = [
        Box::new(Fooable {}),
    ].into();
}

错误:

error[E0277]: the trait bound `Vec<Box<dyn Foo>>: From<[Box<Fooable>; 1]>` is not satisfied
  --> src/main.rs:10:7
   |
10 |     ].into();
   |       ^^^^ the trait `From<[Box<Fooable>; 1]>` is not implemented for `Vec<Box<dyn Foo>>`
   |
   = help: the following other types implement trait `From<T>`:
             <Vec<T, A> as From<Box<[T], A>>>
             <Vec<T, A> as From<VecDeque<T, A>>>
             <Vec<T> as From<&[T]>>
             <Vec<T> as From<&mut [T]>>
             <Vec<T> as From<BinaryHeap<T>>>
             <Vec<T> as From<Cow<'a, [T]>>>
             <Vec<T> as From<[T; N]>>
             <Vec<u8> as From<&str>>
           and 2 others
   = note: required because of the requirements on the impl of `Into<Vec<Box<dyn Foo>>>` for `[Box<Fooable>; 1]`

游戏场

共有2个答案

盖弘毅
2023-03-14
匿名用户

您可以通过如下方式手动转换框来修复错误:

trait Foo {}

struct Fooable {}

impl Foo for Fooable {}

pub fn main() {
    let bar: Vec<Box<dyn Foo>> = [
        // Turn a Box<Fooable> into a Box<dyn Foo>
        Box::new(Fooable {}) as Box<dyn Foo>,
    ].into();
}

请记住,默认情况下,Rust builds直接用对实现(如果存在)的调用替换trait方法调用。对象的“类型”仅在编译时存在,在运行时没有类型dyn类型不同。它们存储一些额外的数据,允许查找要在运行时调用的方法的实际变体。

当您定义这样的整数数组时:

// this works
let k:[i8;3] = [1,2,3]

这里没有发生转换。尽管默认情况下数字是< code>i32,但数组中的数字将被解释为< code>i8值。

在这种情况下也是一样的:

let k:Box<dyn T> = Box::new(V{});

V{}转换为Box

这也适用于数组,但如果存在间接寻址级别,则不适用:

// works
let k:[Box<dyn T>;1] = [Box::new(V{})]
// does not work
let b = [Box::new(Fooable {})];
let e:[Box<dyn Foo>;1] = b;

这也是有效的原因:

let bar: Vec<Box<dyn Foo>> = [
    Box::new(Fooable {}) as Box<dyn Foo>,
    Box::new(Fooable {}),
    Box::new(Fooable {}),
].into()

尽管我们只有<code>as框

杨超
2023-03-14

你是对的。From 有一个全面的实现

更具体地说,这意味着您可以转换[Box

使用显式强制转换来获得您想要的行为。你只需要让Rust相信数组的类型是< code>[Box

let bar: Vec<Box<dyn Foo>> = [
    Box::new(Fooable {}) as Box<dyn Foo>,
].into();

 类似资料:
  • 我有一个要填充信息的对象。我从许多不同的服务中检索信息。我做了一个助手类,它有一个公共方法,然后有许多私有方法来调用服务。我写的东西很好,但我不确定这是否是正确的方法。 您可能想知道为什么我需要一个包含所有这些信息的对象。我需要它全部在一个对象中,因为我从这个java对象创建了一个json对象并将其传递给javascript层。 我的方法有什么问题?我是否应该遵循一种编程范式来做这样的事情? 例子

  • (这是我第二次尝试追踪我的确切问题。查看编辑历史记录) 我有一个简单的通用特性和两种不同的实现: 我现在想要一个包含两个实现元素的向量。正如我在这里学到的,我做: 但是编译器不同意: 一方面,这是有道理的。另一方面,我应该为写什么?我希望它是通用的,所以我不能简单地在那里放或。我可以做

  • 在这里,我试图通过使用来填充我的对象数组。问题是,我得到了一个错误,指出数组在1处超出了索引 此外,文件中的每个标记都由一个空格分隔,这样我就可以在字符串数组中拆分标记,并在属性上进行拆分 文件内容 (名称,作者,发布,编号,版权,科学) 那么有人能帮我写代码吗?或者甚至建议另一种方法?

  • 我正在尝试创建一个特征对象的向量,但我得到了类型不匹配。我还尝试使用代替for循环,但遇到了同样的问题。这是我真实代码的最小版本,我意识到这个例子不需要使用特征对象,但我的真实代码需要,因为列表中除了之外还有其他类型,它们也实现了。如何使用正确的类型创建以便将其传递给?

  • 问题内容: 根据http://www.newtonsoft.com/json/help/html/PopulateObject.htm,您可以通过JSON字符串中定义的值来更新现有实例。我的问题是,我必须填充该对象的数据已经被解析为JToken对象。我当前的方法如下所示: 是否有更好的方法来完成此任务,而不必首先还原在创建JToken时已经完成的解析? 问题答案: 使用阅读器并将其传递给。返回的阅

  • 问题内容: 我使用Json.Net这样填充一个类: 上面的结果JSON字符串填充了我的类中的几个属性。稍后我有一个新的JSON字符串,并希望使用其余属性填充相同的类。是否可以使用JSON.NET或方法?我基本上想在上面的代码行中添加/添加到我填充的帐户对象中。 我的课: 问题答案: 是的,您可以使用第二个JSON字符串来填充现有对象的属性。 这是一个例子: 输出: 小提琴:https : //do