Какие алгоритмы использует компилятор Rust для определения переменных времени жизни?

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

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

Надеемся, что в приведенном выше коде &a и &b должны быть ссылки с разным временем жизни.

Как компилятор определяет время жизни var 'a для foo? Насколько я могу судить, он не использует стандартный алгоритм унификации Хиндли-Милнера. Время жизни должно быть внутренней областью или некоторым пересечением двух времен жизни.

Является ли вывод времени жизни полностью отдельным процессом от вывода стандартного типа?

Использует ли компилятор типы пересечения или какое-то отношение подтипов между временами жизни, чтобы выбрать наиболее ограниченное время жизни?


person Community    schedule 21.04.2017    source источник


Ответы (1)


Rust использует модифицированный алгоритм унификации Хиндли-Милнера, поскольку он имеет отношения подтипов.

Например, &'static T является подтипом &'a T для любого 'a.

Ваш случай относительно прост, когда компилятор видит вызов foo(&a, &b), он просто объединяет 'a как наиболее ограничивающий из обоих времен жизни (что является пересечением, поскольку время жизни пока лексическое).

person Matthieu M.    schedule 21.04.2017
comment
Вы можете описать, как это происходит, пожалуйста. В частности, отличия от стандартного Хиндли-Милнера. - person ; 22.04.2017
comment
(Алгоритм W). - person ; 22.04.2017
comment
@ tm1rbrt: Я ужасно неадекватен, это тоже очень быстро меняется. Возможно, вы захотите проверить новую серию блогов Нико Мацакиса: Unification in Chalk Часть 1 и Часть 2, где он описывает новый алгоритм унификации, над которым он работает и на который он планирует перевести компилятор Rust (частично или полностью). - person Matthieu M.; 24.04.2017