Rust编译器用什么算法推断生命周期变量?

4
fn foo<'a>(x: &'a i32, y: &'a i32) {}

fn main() { 
    let a = 123;
    {
        let b = 234;
        foo(&a, &b);
    }
}

在上面的代码中,&a&b 应该有不同的生命周期引用。编译器是如何推断出foo 的生命周期变量 'a 呢?据我所知,它并没有使用标准的 Hindley-Milner 统一算法。生命周期必须是内部范围或两个生命周期的某个交集。寿命推断是否完全独立于标准类型推断过程?编译器是否使用交叉类型或在生命周期之间使用某些子类型关系来选择最受限制的生命周期?
1个回答

2
Rust使用修改后的Hindley-Milner一致性算法,因为它具有子类型关系。
例如,对于任何'a','&'static T'都是'&'a T'的子类型。
在您的情况下,编译器很容易处理。当编译器看到调用 'foo(&a, &b)' 时,它会将 'a' 统一为两个生命周期中最严格的交集(因为生命周期目前是词法范围)。

请问你能描述一下它是如何做到的吗?特别是与标准的Hindley-Milner算法有什么区别。 - user181351
(算法W) - user181351
@tm1rbrt: 我非常不足,而且它也在很大程度上处于不稳定状态。您可能希望查看Niko Matsakis的新博客系列:Chalk中的统一[第1部分](http://smallcultfollowing.com/babysteps/blog/2017/03/25/unification-in-chalk-part-1/)和[第2部分](http: // smallcultfollowing.com/babysteps/blog/2017/04/23/unification-in-chalk-part-2 /),他正在描述他正在开发的新统一算法,并计划将其部分或全部转移到Rust编译器中。 - Matthieu M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接