rust 高阶生命周期
七月 04, 2024 [Rust] #Rust #obsidian高阶生命周期
高阶生命周期也可以贴近 trait 来指定,唯一的区别是生命周期参数的作用域,像下面这样 'a 的作用域只扩展到后面跟的 trait 的末尾,而不是整个约束3。下面这个函数和上一个等价。
fn call_on_ref_zero<F>(f: F) where F: for<'a> Fn(&'a i32) {
let zero = 0;
f(&zero);
}
1 译者理解:理解这种关系时,可以把生命周期 'a 和 'b 理解成去引用对象时需传入的参数,给定 'a: 'b 和类型 T,如果 'b T有效,那此时再传入 'a 就去引用 T 必定有效。
4 译者理解:高阶 trait约束就是对带生命周期的类型重新进行约束。像这句中的例子就是对 &'a T 加上了 PartialEq<i32> 的约束,其中 for<'a> 可以理解为:对于 'a 的所有可能选择。更多信息请参见:https://doc.rust-lang.org/std/cmp/trait.PartialEq.html 和 https://doc.rust-lang.org/nightly/nomicon/hrtb.html
2 译者理解此例中的代码 for<'a> F: Fn(&'a i32) 为:F 对于 'a 的所有可能选择都受 Fn(&'a i32) 的约束。
3 译者理解这句的意思是:如果 F 的约束有多个 trait,那这种方式里, 'a 的作用域只是扩展它后面紧跟的那个 trait 的方法,即 Fn(&'a i32) 里。