簡體   English   中英

將對元組的引用迭代器解壓縮為兩個引用集合

[英]Unzip iterator of references to tuples into two collections of references

我在切片&[(T, U)]有一個Iterator<Item = &(T, U)> 我想將此迭代器解壓縮到其組件中(即,獲取(Vec<&T>, Vec<&U>) )。

銹通過提供解壓功能.unzip()上的方法Interator

points.iter().unzip()

不幸的是,這不能按.unzip()工作,因為.unzip()期望迭代器的項的類型為元組。 我的是對元組的引用。

為了解決這個問題,我嘗試編寫一個函數,該函數在對元組的引用和對引用的元組之間進行轉換:

fn distribute_ref<'a, T, U>(x: &'a (T, U)) -> (&'a T, &'a U) {
    (&x.0, &x.1)
}

然后,我可以map到生成的迭代器上,以獲取.unzip()可以處理的內容:

points.iter().map(distribute_ref).unzip()

現在可以使用,但是我有點奇怪。 特別是,Rust標准庫提供的distribute_ref似乎是一個相當簡單的操作。 我猜它是或者我找不到它,或者我沒有以正確的方式接近它。

有一個更好的方法嗎?

有一個更好的方法嗎?

“更好”有點主觀。 您可以使函數更短:

fn distribute_ref<T, U>(x: &(T, U)) -> (&T, &U) {
    (&x.0, &x.1)
}

終身省音允許省略一生的注釋在這種情況下。

您可以使用閉包執行相同的操作:

points.iter().map(|&(ref a, ref b)| (a, b)).unzip()

根據任務,克隆數據就足夠了。 特別是在這種情況下,引用u8占用的空間是u8本身的4或8倍。

points().iter().cloned().unzip()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM