2017-04-21 9 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의 경우 var 'a? 내가 알 수있는 한 표준 Hindley-Milner 통일 알고리즘을 사용하지 않고 있습니다. 평생은 내면 범위이거나 두 수명의 교차점이어야합니다.

평생 추론은 표준 유형 유추와 완전히 다른 프로세스입니까?

컴파일러는 교차 유형을 사용합니까? 수명 기간 중 일부 하위 유형 관계를 사용하여 가장 제한된 수명을 선택합니까?

답변

1

Rust는 하위 유형 관계가 있으므로 수정 된 Hindley-Milner 통합 알고리즘을 사용합니다.

예를 들어 &'static T'a에 대한 &'a T의 하위 유형입니다.

컴파일러가 전화를 걸 때 컴파일러가 foo(&a, &b)을 볼 때 상대적으로 쉽습니다. 'a은 두 수명 중 가장 제한적인 것 (수명은 이제 어휘이므로 교집합입니다)을 통합합니다.

+0

설명해 주시겠습니까? 특히 표준 Hindley-Milner와의 차이점. –

+0

(알고리즘 W). –

+0

@ 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 컴파일러를 (부분적으로 또는 전체적으로) 전환 할 계획이다. –