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
의 경우 var 'a
? 내가 알 수있는 한 표준 Hindley-Milner 통일 알고리즘을 사용하지 않고 있습니다. 평생은 내면 범위이거나 두 수명의 교차점이어야합니다.
평생 추론은 표준 유형 유추와 완전히 다른 프로세스입니까?
컴파일러는 교차 유형을 사용합니까? 수명 기간 중 일부 하위 유형 관계를 사용하여 가장 제한된 수명을 선택합니까?
설명해 주시겠습니까? 특히 표준 Hindley-Milner와의 차이점. –
(알고리즘 W). –
@ tm1rbrt : 나는 비참하게도 적절치 못하다. 또한 매우 유동적이다. Niko Matsakis의 새로운 블로그 세리를 확인하고 싶을 수도 있습니다. 분필로 통일하기 [Part 1] (http://smallcultfollowing.com/babysteps/blog/2017/03/25/unification-in-chalk-part-1/)와 [Part 2] (http://smallcultfollowing.com/babysteps/blog/2017/04/23/unification-in-chalk-part-2/)에서 그가 일하고있는 통일을위한 새로운 알고리즘을 설명하고있다. 그는 Rust 컴파일러를 (부분적으로 또는 전체적으로) 전환 할 계획이다. –