2.4.1 解答
01-解答 — Comprehensive Rust
2 分钟阅读
译文 · 基于 Comprehensive Rust
原文链接: https://google.github.io/comprehensive-rust/closures/solution.html
2.4.1 解答
| |
- 存储闭包: 要在结构体中存储闭包,我们使用泛型类型参数(这里是
P)。这是因为 Rust 中每个闭包都有编译器生成的唯一匿名类型。 Fntrait 约束: 约束P: Fn(u8, &str) -> bool告诉编译器:P可以作为带指定参数与返回类型的函数来调用。我们用Fn(而不是FnMut或FnOnce),因为log取&self,所以只能以不可变方式访问谓词。- 调用字段: 用
(self.predicate)(...)调用闭包。self.predicate周围的圆括号是必要的,以便区分「调用名为predicate的方法」与「调用字段本身」。
- 讨论为何需要
Fn。若用FnMut,log就需要取&mut self,这与Loggertrait 签名冲突。若用FnOnce,就只能记录一条消息!new的impl块也包含约束。虽然对结构体定义本身并非严格必需(约束可以只放在使用它们的impl块上),但放在new上有助于类型推断。