我试图获得一个切片的“视图”(即没有复制),其中包含一个前置头元素以及一个附加到其上的最后一个元素。
我知道如何使用Groovy(也可能是Ruby)语法来表达它:
def elements = [ 'a', 'b' ]
def result = [ 'head', *elements, 'tail' ]
assert result == [ 'head', 'a', 'b', 'tail' ]
上面的*
是点差运营商。
在Rust中,这似乎有点困难......我只能找到解决方案,我将切片复制到一个可变的载体中,然后推动并插入尾部和头部。
我希望有可能使用一个可迭代的东西,或者似乎只包含我想要的元素,如上例所示......在Rust中是否可以?怎么样?
答案 0 :(得分:2)
如果您只需要一个迭代器,则可以使用iter::once
和Iterator::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
是对值的引用,因此是&&str
。 cloned
转换回&str
。
Rust可以吗?
绝对不可能构造具有“额外”元素的切片。
根据定义,切片是一系列在内存中连续的值。它的文字定义是指向数据开头和元素数量的指针。根本没有存储“额外”元素的位置。