![](/img/trans.png)
[英]What is the difference between Promise.all vs. x => Promise.all(x) in a promise chain?
[英]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.