簡體   English   中英

filter(| x |)和filter(|&x |)之間有什么區別?

[英]What's the difference between filter(|x|) and filter(|&x|)?

Rust Book中有一個在迭代器上調用filter()的例子:

for i in (1..100).filter(|&x| x % 2 == 0) {
    println!("{}", i);
}

下面有一個解釋,但我無法理解它:

這將打印一到一百之間的所有偶數。 (請注意,因為過濾器不使用正在迭代的元素,所以它會傳遞對每個元素的引用,因此過濾謂詞使用&x模式來提取整數本身。)

然而,這不起作用:

for i in (1..100).filter(|&x| *x % 2 == 0) {
    println!("i={}", i);
}

為什么閉包的參數是引用|&x| 而不是|x| 使用|&x|之間的區別是什么? |x|

我理解使用引用|&x| 效率更高,但我很困惑的事實是我不必通過使用*x取消引用x指針。

當用作模式匹配(並且閉包和函數參數也是模式匹配)時, & 綁定到引用,使變量成為解除引用的值。

fn main() {
    let an_int: u8 = 42;
    // Note that the `&` is on the right side of the `:`
    let ref_to_int: &u8 = &an_int; 
    // Note that the `&` is on the left side of the `:`
    let &another_int = ref_to_int;
    let () = another_int;
}

有錯誤:

error: mismatched types:
 expected `u8`,
    found `()`

如果您查看案例的錯誤消息,則表示您無法取消引用它,因為它不是引用

error: type `_` cannot be dereferenced

我沒有必要使用* x取消引用x指針。

那是因為你在模式匹配中隱式取消引用它。

我理解使用引用|&x | 效率更高

如果這是真的,那么除了參考之外沒有理由使用任何東西! 也就是說,引用需要額外的間接來獲取真實數據。 有一些可衡量的截止點,按值傳遞項目比傳遞對它們的引用更有效。

如果是這樣,為什么要使用|x| 不拋出錯誤? 根據我對C的經驗,我希望在這里收到一個指針。

你以參考的形式做到了。 x是對(在此示例中) i32 但是, %運算符由特征Rem ,它針對所有參考/值對實現:

impl Rem<i32> for i32
impl<'a> Rem<i32> for &'a i32
impl<'a> Rem<&'a i32> for i32
impl<'a, 'b> Rem<&'a i32> for &'b i32

這允許您不需要顯式取消引用它。

或者Rust是否在這里隱式地在堆棧上分配原始x的值的副本?

它強調沒有做到這一點。 實際上,這樣做是不安全的,除非迭代的項目實現了Copy (或者可能是Clone ,在這種情況下它也可能很昂貴)。 這就是引用用作閉包參數的原因。

暫無
暫無

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

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