2017-04-21 11 views
3
fn foo<'a>(x: &'a i32, y: &'a i32) {} 

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

&a&bのコードでは、別の生涯の参考になるはずです。生涯変数を推定するためにRustコンパイラはどのアルゴリズムを使用していますか?

コンパイラはどのようにして寿命を推測しますかfooの場合は'aですか?私が知る限り、標準のHindley-Milner統一アルゴリズムは使用していません。生涯は、内側スコープまたは2つの生涯の交叉でなければなりません。

ライフタイム推論は、標準タイプの推論とは完全に別のプロセスですか?

コンパイラは交差タイプを使用するか、寿命の間にいくつかのサブタイプの関係を使用して、最も制限された有効期間を選択しますか?

答えて

1

Rustは、サブタイプの関係があるため、変更されたHindley-Milner統合アルゴリズムを使用します。

たとえば、&'static Tは、いずれも'aのサブタイプ&'a Tです。

あなたのケースは比較的簡単です。コンパイラが電話を受けると、'aは、両方の生存時間の最も制限的なもの(生存時間は現在の字句であるため、交点です)を統一します。

+0

これはどのように記述しますか。具体的には、標準ヒンドレーミルナーとの違い。 –

+0

(アルゴリズムW)。 –

+0

@ tm1rbrt:私は悲惨なことに不十分です、それはまた非常に流動的です。 Niko Matsakisの新しいブログセリをチェックしたいと思うかもしれません:チョークの統一[第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コンパイラを(部分的にまたは全体的に)移行する予定です。 –

関連する問題