【发布时间】:2020-01-09 22:00:41
【问题描述】:
我正在通过借用Vec<Box<Foo>> 字段来在结构上实现一个方法,该方法应返回&[&Foo]。我将如何实现它?
我尝试通过将Vec<Box<Foo>> 映射到Vec<&Foo> 来进行转换,但是这随后被分配到堆栈上,这意味着它的一部分无法返回。
这是一个问题的例子:
struct Bar {
baz: Vec<Box<Foo>>,
}
impl Bar {
pub fn buzz(&self) -> &[&Foo] {
// How do I implement this to return
// the data that is in self.baz?
}
}
【问题讨论】:
-
Vec<Box<T>>should only be used in very specific situations,例如当T未调整大小时。否则,您可以考虑不使用额外的参考层。您也可以考虑不转换这些框并简单地返回&[Box<Foo>],在这种情况下更容易获得。 -
如果没有分配,您将无法执行此操作 - 您要么需要一个中间映射步骤才能将
Box<Foo>转换为&Foo(即使这样也是有风险的,因为您是暗示 Foo:Sized` 这样做是为了获得Vec<&Foo>并可以调用as_slice(),或者您需要保留&[Box<Foo>]并从那里分配每个元素。不过,您的目标是什么? -
@SébastienRenauld 在这种情况下 Foo 是一个特征对象,这意味着我必须将它包装在一个盒子中。我觉得使用 Vec 作为返回类型会多余地返回一个拥有的向量,因为它在概念上只是一些现有数据的不可变视图。
-
@SCappella 不幸的是 Foo 确实没有尺寸,因此是盒子。另外我相信返回 &[Box
] 意味着每个元素的所有权都不起作用。 -
出于审美原因,
&[]中的&确实不存在。它不是自有结构。
标签: reference rust type-conversion slice