Rust编译器使用哪些算法来推断生命周期变量?
fn foo<'a>(x: &'a i32, y: &'a i32) {}
fn main() {
let a = 123;
{
let b = 234;
foo(&a, &b);
}
}
在上面的代码中, &a
和&b
应该有希望成为不同生命期的参考。
编译器如何推断寿命变种'a
为foo
? 据我所知,它没有使用标准的Hindley-Milner统一算法。 生命周期必须是内部范围或两个生命周期的某个交集。
终身推论是否与标准类型推断完全分离?
编译器使用交集类型还是使用生存期间的某种子类型关系来选择最受限制的生命周期?
Rust使用修改的Hindley-Milner统一算法,因为它具有子类型关系。
例如, &'static T
是任何'a
&'a T
子类型。
你的情况相对容易,当编译器看到foo(&a, &b)
这个调用时foo(&a, &b)
它只是将'a
作为两个生命周期中最具限制性的(这是交集,因为生命时间现在是词法)。
上一篇: What algorithms does the Rust compiler use to infer lifetime variables?
下一篇: ML type error?