Почему этот код со строковыми литералами компилируется, когда один из них выходит из области видимости? - PullRequest
2 голосов
/ 24 марта 2020

Я натолкнулся на раздел , рассказывающий о жизнях , и поначалу был немного смущен. Поэтому я решил дать ему go, приведя небольшой пример. ( Детская площадка )

fn main() {
    let b = "hello";
    let mut d = "Unassigned";
    {
        let a = "hi";
        let c = lifetime(&a, &b);
        d = &c;
    }

    // My confusion happens here, I was expecting a compile-time error
    // since the lifetime of 'c' is the same as 'a' which is in the previous block
    // from my understanding. But this compiles just fine
    println!("{}", d);
}

fn lifetime<'a, 'b>(test: &'a str, test2: &'b str) -> &'a str {
    println!("{}, {}", test, test2);
    return "returned value of lifetime";
}

Насколько я понимаю, функция lifetime связывает время жизни 'a с возвращенным опорным значением. Поэтому обычно я ожидаю, что строка println!("{}", d); прервется во время компиляции с ошибкой, указывающей, что время жизни 'a находится вне области видимости, что я ошибался.

Что я понял неправильно? Почему этот код компилируется?


Я видел это и , что , что в основном просто смутило меня еще больше, потому что они в некоторой степени говорят то, что я ожидал как результат на первом месте.

1 Ответ

2 голосов
/ 24 марта 2020

Узнав о контравариантности , как указано в комментарии выше, я написал этот небольшой фрагмент (аналогично вопросу)

struct Potato(i32);

fn doesnt_work() {
    let b = Potato(1);
    let d;
    {
        let a = Potato(2);
        let c = lifetime2(&b, &a);
        d = c;
    }

    // Compile-time error ! Borrowed value does not live long enough.
    println!("{}", d.0);
}

fn lifetime2<'a, 'b>(test: &'a Potato, test2: &'b Potato) -> &'a Potato {
    return &Potato(test.0);
}

, который теперь дает фактическую ожидаемую ошибка времени.

В моем исходном вопросе выясняется, что время жизни выводится как 'static, что является наивысшим общим временем жизни среди str ссылок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...