如何在Rust中从向量获取引用的片段?

4
在我使用的API中,有一个函数需要以&[&A]作为参数,但我只有一个A对象的向量。当我尝试使用以下语法following syntax调用此函数时:
pub struct A(pub u64);

fn test(a: &[&A]){}

fn main() {
   let v = vec![A(1), A(2), A(3)];
   let a = &v[..];
   test(a);
}

我有一个错误:

<anon>:12:9: 12:10 error: mismatched types:
 expected `&[&A]`,
    found `&[A]`
(expected &-ptr,
    found struct `A`) [E0308]

我已经尝试过几次,但都没有成功:

let a = &v[&..]

并且

let a = &v[&A]

如何从 Vec<A> 制作 &[&A]


1
简短回答:你不能。这些类型彼此不兼容。 - mcarton
那好吧,我很感兴趣 - 如果API的函数有这种参数,它们应该如何运行? - Victor Polevoy
1
如果这确实是 API 需要的,你可以使用 test(&v.iter().collect::<Vec<_>>());,但是这会分配一个新的向量。如果您是 API 的作者,请考虑更改它:[&T] 是一种奇怪的类型,因为您需要不同的所有者来管理切片和其中的对象。而 &[T] 已经具有了内部对象的传递引用语义。 - mcarton
@mcarton 谢谢,那我会提交一个PR并联系维护者。不知道该怎么处理这个问题。也许你可以用这些信息回答一下? - Victor Polevoy
2
如果更改 test 是一个选项,可以将其定义为 fn test<T: std::borrow::Borrow<A>>(a: &[T]) {},这将接受 &[&A]&[A]。这也将向后兼容。 - nngg
1个回答

10

简短回答:你不能。这些类型彼此不兼容。

如果API确实需要这样做,您可以尝试以下操作:

test(&v.iter().collect::<Vec<_>>());

但是这会分配一个新的向量。如果您是API的作者,请考虑更改它:使用&[T]代替&[&T],因为您需要不同的所有者来处理切片和其中的对象,而&[T]已经具有传递内部对象的引用语义。


@Shepmaster,你有任何具体的例子可以说明这个用法有什么用处吗?我能想到的唯一用途是 &[&'static str] - mcarton
1
我能想到的一个是对特质对象的引用:&[&Display]。根据 API 的不同,他们可能需要保持向后兼容性。 - Shepmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接