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?

★★★

point1 уничтожается до list. Создавай list после point1.

tailgunner ★★★★★ ()

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

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

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

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

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

kirk_johnson ★☆ ()
Последнее исправление: kirk_johnson (всего исправлений: 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 ★★★★ ()
Ответ на: комментарий от tailgunner

То есть конечно ownership над rect мы передаем, но это не важно в контексте проблемы)

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

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

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

Именно, я это и имел в виду, когда сказал что «мы не передаем ownership в list»

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

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

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

Это важно для того, чтобы исправить ошибку. Нужно понимать, что ссылкой владеет list, а не rect.

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

Транзитивность же. list владеет rect, rect владеет ссылкой. Следовательно list владеет ссылкой.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В Rust вызов деструктора тоже происходит в рантайме.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

И в Rust тоже. Что ты пытаешься доказать?

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

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

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

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

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

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

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

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

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

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