Rust 學習筆記:關于閉包的練習題
- Rust 學習筆記:關于閉包的練習題
- 問題 1
- 問題 2
- 以下程序能否通過編譯?若能,輸出是?
- 以下程序能否通過編譯?若能,輸出是?
- 考慮該 API,空白處填寫哪個 Fn trait 最合適?
- 考慮該 API,空白處填寫哪個 Fn trait 最合適?
Rust 學習筆記:關于閉包的練習題
參考視頻:
- https://www.bilibili.com/video/BV1u5NZe7Eyz
問題 1
下列哪項最能描述為什么 Rust 會推斷閉包參數/返回值類型,但不會推斷頂層函數的參數/返回值類型的理由?
A. 由于向后兼容性需要與舊版 Rust 兼容。
B. 頂層函數可以是庫外部接口的一部分,而閉包不能直接暴露。
C. 由于停機問題(halting problem),從數學上講,Rust 推斷頂層函數類型是不可能的。
D. 任何可分配給變量的東西都可以推斷類型,而頂層函數不能分配給變量。
答:B。
問題 2
Rust 允許在閉包的參數中進行模式匹配,包括使用下劃線。代碼如下:
let f = |_| ();
let s = String::from("Hello");
f(s);
A. f 讀取 s 然后丟棄結果。
B. f 對 s 沒有影響。
C. f 導致 s 立即被丟棄。
D. f 捕獲 s 在其環境中。
答:C。
以下程序能否通過編譯?若能,輸出是?
fn main() {let mut s = String::from("hello");let mut add_suffix = || s.push_str(", world!");println!("{}", s);add_suffix();
}
答:不能通過編譯。
以下程序能否通過編譯?若能,輸出是?
fn main() {let mut s = String::from("Hello");let mut add_suffix = |s: &mut String| s.push_str(" world");println!("{}", s);add_suffix(&mut s);
}
答:可以通過編譯。輸出 Hello。
考慮該 API,空白處填寫哪個 Fn trait 最合適?
fn for_each_mut<T, F: ____(&mut T)> (v: &mut Vec<T>, mut f: F) {for x in v.iter_mut() {f(x);}
}
答:FnMut。
因為這個閉包需要多次調用,并且改變數組 v 中的元素值。
考慮該 API,空白處填寫哪個 Fn trait 最合適?
pub struct Analyzer<F> {postprocess: F,
}impl<F: ___(i32) -> i32> Analyzer<F> {fn process(&self, n: i32) -> i32 { /* ... */ }pub fn pipeline(&self, n: i32) -> i32 {let n = self.process(n);(self.postprocess)(n)}
}
答:Fn。
因為這個閉包需要改變所有權。