为什么下面的代码是错误的?< 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]`
游戏场
匿名用户
您可以通过如下方式手动转换框来修复错误:
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框
你是对的。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