2017-05-15 49 views
1

我試圖得到一個包含一個預先定義的head元素以及最後一個元素的切片(即不復制)的「視圖」。如何使用添加的頭部和尾部在切片上查看視圖?

我知道如何表達這種使用Groovy(可能也紅寶石)語法:以上

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

*是傳播運營商。

在鏽,這似乎有點難...我只能找到解決方案,我將片複製到一個可變的向量,然後推並插入尾巴和頭。

我一直希望能夠使用iterable或其他東西,只是看起來包含我想要的元素,就像上面的例子一樣......在Rust中可能嗎?怎麼樣?

回答

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


是否有可能在鏽?

構建帶有「額外」元素的切片是絕對不可能的。

A 切片,根據定義,是一系列值爲的連續內存。它的字面定義是一個指向數據開始和元素數量的指針。沒有地方可以存儲「額外」元素。

+0

不錯的解決方案,這就是我想要的,謝謝! – Renato

+0

但是請注意,我從來沒有要求過一個切片,我要求一個「視圖」(不確定'迭代器'是否適用於Rust)。所以答案的第一部分是沒有必要的。 – Renato

+0

@Renato關於Stack Overflow的問題和解答並不僅僅適用於您,提問者或我,還是回答者。他們的意思是*每個追隨我們的人*。爲此,答案必須「在邊緣以外着色*少許*」以幫助所有那些通過搜索引擎找到您的問題的人,閱讀標題,然後直接跳到答案。我同意我可以翻轉這兩部分的順序。 – Shepmaster

相關問題