如何通过添加头部和尾部来获得切片视图?

时间:2017-05-15 20:25:59

标签: rust

我试图获得一个切片的“视图”(即没有复制),其中包含一个前置头元素以及一个附加到其上的最后一个元素。

我知道如何使用Groovy(也可能是Ruby)语法来表达它:

def elements = [ 'a', 'b' ]
def result = [ 'head', *elements, 'tail' ]
assert result == [ 'head', 'a', 'b', 'tail' ]

上面的*是点差运营商。

在Rust中,这似乎有点困难......我只能找到解决方案,我将切片复制到一个可变的载体中,然后推动并插入尾部和头部。

我希望有可能使用一个可迭代的东西,或者似乎只包含我想要的元素,如上例所示......在Rust中是否可以?怎么样?

1 个答案:

答案 0 :(得分:2)

如果您只需要一个迭代器,则可以使用iter::onceIterator::chain

use std::iter;

fn main() {
    let elements = ["a", "b"];
    let head = iter::once("head");
    let tail = iter::once("tail");
    let result = head.chain(elements.iter().cloned()).chain(tail);

    assert!(["head", "a", "b", "tail"].iter().cloned().eq(result));
}

我还必须使用cloned,因为数组的Iterator::Item是对值的引用,因此是&&strcloned转换回&str

  

Rust可以吗?

绝对不可能构造具有“额外”元素的切片。

根据定义,切片是一系列在内存中连续的值。它的文字定义是指向数据开头和元素数量的指针。根本没有存储“额外”元素的位置。