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つの生涯の交叉でなければなりません。
ライフタイム推論は、標準タイプの推論とは完全に別のプロセスですか?
コンパイラは交差タイプを使用するか、寿命の間にいくつかのサブタイプの関係を使用して、最も制限された有効期間を選択しますか?
これはどのように記述しますか。具体的には、標準ヒンドレーミルナーとの違い。 –
(アルゴリズムW)。 –
@ 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コンパイラを(部分的にまたは全体的に)移行する予定です。 –