fn foo<'a>(x: &'a i32, y: &'a i32) {}
fn main() {
let a = 123;
{
let b = 234;
foo(&a, &b);
}
}
在上面的代码中, &a
和 &b
应该是不同生命周期的引用 .
编译器如何推断 foo
的生命周期var 'a
?据我所知,它没有使用标准的Hindley-Milner统一算法 . 寿命必须是内部范围或两个生命周期的某个交集 .
终身推理是否与标准类型推断完全分开?
编译器是否使用交集类型或使用生命周期之间的某些子类型关系来选择最受限制的生命周期?
1 回答
Rust使用修改后的Hindley-Milner统一算法,因为它具有子类型关系 .
例如,对于任何
'a
,&'static T
是&'a T
的子类型 .你的情况相对容易,当编译器看到调用
foo(&a, &b)
时,它只是将'a
统一为两个生命周期中最严格的(这是交集,因为生命周期现在是词法) .