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统一算法。生命周期必须是内部范围或两个生命周期的某个交集。
生命周期推断是否与标准类型推断完全分开?
编译器是否使用交集类型或使用生命周期之间的某些子类型关系来选择最受限制的生命周期?
答案 0 :(得分:2)
Rust使用修改后的Hindley-Milner统一算法,因为它具有子类型关系。
例如,对于任何&'static T
,&'a T
都是'a
的子类型。
你的情况相对容易,当编译器看到调用foo(&a, &b)
时,它只是将'a
统一为两个生命周期中最严格的(这是交集,因为现在生命是词法)。 / p>