LINUX.ORG.RU

Я познаю Rust: Лайфтаймы

 ,


2

5

Пытаюсь разобраться как работать с лайфтаймами:

use std::collections::LinkedList;

struct Point {
    x: f32,
    y: f32,
}

struct Rectangle<'a> {
    p2: &'a Point,
    p1: &'a Point,
}

fn main() {
    let mut list = LinkedList::new();
    let point1 = Point { x: 0.3, y: 0.4 };
    let point2 = Point { x: 0.3, y: 0.4 };
    
    let rect = Rectangle { p1:&point1, p2:&point2};
    list.push_back(rect);
    list.clear();
}

Как правильно очищать список, чтобы компилятор не ругался на point1, point2?

★★★★★
Ответ на: комментарий от tailgunner

Вот вывод компилятора:

rustc 1.15.1 (021bd294c 2017-02-08)
error: `point1` does not live long enough
  --> <anon>:21:1
   |
18 |     let rect = Rectangle { p1:&point1, p2:&point2};
   |                                ------ borrow occurs here
...
21 | }
   | ^ `point1` dropped here while still borrowed
   |
   = note: values in a scope are dropped in the opposite order they are created

error: `point2` does not live long enough
  --> <anon>:21:1
   |
18 |     let rect = Rectangle { p1:&point1, p2:&point2};
   |                                            ------ borrow occurs here
...
21 | }
   | ^ `point2` dropped here while still borrowed
   |
   = note: values in a scope are dropped in the opposite order they are created

error: aborting due to 2 previous errors

Я не вижу здесь ни слова про список.

kirk_johnson ★☆
()
Ответ на: комментарий от kirk_johnson

Я не вижу здесь ни слова про список.

Здесь надо было увидеть сообщение о выходе из скопа. Но потом да, применить человеческую логику - заподозрить, что транслятор сообщил только о первом заимствовании из каскада.

tailgunner ★★★★★
()
Ответ на: комментарий от kirk_johnson

Это очень неожиданное поведение от компилятора. Он понимает, что мы передали ownership в list

Нет, не понимает. И слава богу, потому что мы не передаем ownership в list.
В list мы передаем ссылки на Point, которые находятся в Rect и про это компилятор и ругается в отрывке, котоорый ты привел.

mersinvald ★★★★★
()
Последнее исправление: mersinvald (всего исправлений: 1)
Ответ на: комментарий от mersinvald

И слава богу, потому что мы не передаем ownership в list.

Так, теперь я уже ничего не понимаю. Как не передаем, когда:

fn push_front(&mut self, elt: T)
tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Но компилятор ругается не на rect, который мы передаем и который уничтожается вместе с list, там все ок, а на &point1 и &point2, которые rect заимствует.
Pointы дропаются раньше, чем истекает лайфтайм ссылок в Rect.
Почему ошибка не смотря на то, что вызывается .clear()? Лайфтаймы штука статическая и в рантайме они не истекают.

mersinvald ★★★★★
()
Ответ на: комментарий от mersinvald

Ну как это не важно. Транслятор видит, что point1 и point2 позаимствованы объектом list, а не объектом rect, по крайней мере, я не вижу другого объяснения.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Владение ссылкой? Ээээ, ну, да. Но какое это имеет значение?
Поясни что ты имеешь в виду и почему это важно

mersinvald ★★★★★
()
Ответ на: комментарий от tailgunner

Да. Но, судя по вопросам в этом топике, это не очевидно.

Меня удивило, что Rust не пишет всю цепочку.

kirk_johnson ★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.