我如何连接两个切片或两个向量,并且仍然可以访问原始值? 我有两个切片或向量,我想添加它们,如Golang所示: A:= []字节{1,2,3} B:= []字节{4,5,6} ab:= append(a,b ...) ba:= append(b,a ...) 我该如何在生锈...

问题描述 投票:0回答:2

我可以在生锈吗?我发现了其他一些问题,例如:

将切片附加到向量的惯用方法是什么? rust中的连接媒介的最佳方法

    ,但他们最好的答案是
  • a += b,而不是ab = a + b
  • let mut a = vec![1, 2, 3]; let mut b = vec![4, 5, 6]; a.append(&mut b); assert_eq!(a, [1, 2, 3, 4, 5, 6]); assert_eq!(b, []); 或可能有像Rust这样的功能吗?

您可以
Vec::append(a, b)

迭代器:
chain

注意迭代器知道其产生的项目数量,因此可以直接分配适量的内存:

fn main() { let a = vec![1, 2, 3]; let b = vec![4, 5, 6]; // Don't consume the original vectors and clone the items: let ab: Vec<_> = a.iter().chain(&b).cloned().collect(); // Consume the original vectors. The items do not need to be cloneable: let ba: Vec<_> = b.into_iter().chain(a).collect(); assert_eq!(ab, [1, 2, 3, 4, 5, 6]); assert_eq!(ba, [4, 5, 6, 1, 2, 3]); }
vector rust append slice
2个回答
7
投票

没有直接附加两个切片的

vec
的构造函数。 功能不是基本的,因为您可以自己实施:

collect

如果您经常发现自己执行此操作,则可能更喜欢编写一个功能来执行此操作:

fn main() {
    let a = vec![1, 2, 3];
    let b = vec![4, 5, 6];

    let ba = b.into_iter().chain(a);
    assert_eq!(ba.size_hint(), (6, Some(6)));

    let ba: Vec<_> = ba.collect();
    assert_eq!(ba, [4, 5, 6, 1, 2, 3]);
}

然后您将能够做:
let ab = { let mut r = a.clone(); r.extend_from_slice(&b); r };

© www.soinside.com 2019 - 2024. All rights reserved.