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?

★★★★★

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

Порядок вызова конструкторов (и деструкторов), который определяется порядком объявления, тоже кажется тебе шуткой?

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

Ну здесь же нет выхода из scope'а

Есть. Именно он происходит, именно об этом и предупреждение.

Список очищается до выхода из функции.

Транслятор понятия не имеет, что делает функция clear.

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

Есть. Именно он происходит, именно об этом и предупреждение.

Эээ...

Транслятор понятия не имеет, что делает функция clear.

Эээ... То есть несмотря на то, что я уже очистил список, и с точки зрения человеческой логики все ок, rust не осиливает и вопит про ошибки? P_P

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

Ну здесь же нет выхода из scope'а

Именно он происходит, именно об этом и предупреждение.

Эээ...

Ты не понимаешь, что происходит выход из функции, и даже не смотрел сообщение об ошибке. Действительно «эээ».

с точки зрения человеческой логики все ок, rust не осиливает и вопит про ошибки?

А ты ожидал, что компилятор умен, как ты? P_P

Впрочем, даже хорошо, что он не такой.

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

Ты не понимаешь, что происходит выход из функции, и даже не смотрел сообщение об ошибке. Действительно «эээ».

Я просто ожидал какого-то разумного поведения в этом случае.

А ты ожидал, что компилятор умен, как ты? P_P

Уйми свой генератор желчи, серьезно. С тобой становится очень неприятно общаться.

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

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

Ты не понимаешь, что происходит выход из функции, и даже не смотрел сообщение об ошибке. Действительно «эээ».

Я просто ожидал какого-то разумного поведения в этом случае.

Посмотри сообщение об ошибке на https://play.rust-lang.org/. Если оно не разумно, то разумных сообщений об ошибках тупо не существует.

Уйми свой генератор желчи, серьезно. С тобой становится очень неприятно общаться.

Извини. Я не могу выключить генератор желчи, потому что у меня его нет - я им являюсь.

tailgunner ★★★★★
()
Ответ на: комментарий от 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

Время жизни зависит от порядка объявления?

Шах и мат быдлокодерам. Не взлетит...

bread
()
Ответ на: комментарий от 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 ★★★★★
()

Ладно, я пожалуй пойду почитаю доки по Rust, потому что я тут явно начинаю нести ахинею.

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

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

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

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

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

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

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

OMG, спасибо, ты отбил мне охоту изучать Rust.

Всегда готов помочь...

C++ снова в моих фаворитах.

...но не надо сваливать на меня свою неуверенность в собственных силах.

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

OMG, спасибо, ты отбил мне охоту изучать Rust. C++ снова в моих фаворитах.

Как раз для сиплюсников тут все должно быть логично.

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

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

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

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

В плюсах это делается в рантайме.

Что «это»? В плюсах точно так же есть время жизни объекта, и точно так же можно накосячить с порядком объявления и ссылками/указателями, только компилятор тебе ничего не скажет.

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

В плюсах это не делается. Там нет никакого контроля висячих ссылок, в рантайме есть только shared_ptr, который аналог Rc, а не правилам владения/заимствования

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

Что «это»? В плюсах точно так же есть время жизни объекта, и точно так же можно накосячить с порядком объявления и ссылками/указателями, только компилятор тебе ничего не скажет.

Ага, потому что вызов деструктора происходит в рантайме.

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

В плюсах это не делается.

В плюсах есть конструкторы / деструкторы.

Там нет никакого контроля висячих ссылок, в рантайме есть только shared_ptr, который аналог Rc, а не правилам владения/заимствования.

shared_ptr тоже не всегда контролирует висячие ссылки. Там руками weak_ptr делать нужно.

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

Ага, потому что вызов деструктора происходит в рантайме.

Происходит в рантайме, а момент его вызова определяется на этапе компиляции.

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

То есть несмотря на то, что я уже очистил список

На этапе компиляции - нет. Это просто метод. Компилятору без разницы, что вы в нём сделали.

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

В плюсах есть конструкторы / деструкторы.

Это не аналог лайфтаймов, как минимум на этапе компиляции. И они никак не влияют на ссылки, в отличии от раста.

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

Это не аналог лайфтаймов, как минимум на этапе компиляции. И они никак не влияют на ссылки, в отличии от раста.

Я и не говорил, что это аналог лайфтайма.

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

> В плюсах это не делается.
В плюсах есть конструкторы / деструкторы.

Либо мы говорим не о лайфтаймах, а тогда объясни что же таки «это». Либо я не понимаю к чемы ты вообще написал про конструкторы-деструкторы.

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

Либо мы говорим не о лайфтаймах, а тогда объясни что же таки «это». Либо я не понимаю к чемы ты вообще написал про конструкторы-деструкторы.

Ммм... я не помню уже. Пойду посплю %)

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