LINUX.ORG.RU

дублированные ссылки на объект

 


0

5

Такой вопрос. Есть у меня есть некий объект. И есть вектор, который хранит ссылки на объекты этого же типа. Насколько я понимаю, все присваивания в Rust просиходят перемещением объекта (или явным копированием). Т.е. если я сделаю

..
let x = get_new_object();
my_vector[42] = x;

, то «x» перестанет ссылаться на объект, а ссылку «украдет» вектор. Так? А если мне надо сохранить 2 ссылки на объект, но при этом не создавать копий, то как быть? Использовать рантаймовый счетчик ссылок?



Последнее исправление: jcdr (всего исправлений: 3)

Ссылка — это противоположность перемещению. Можно либо перемещать, либо заимствовать (брать ссылку).

Правда, я не знаю, что скажет borrow checker, если попытаться сохранить ссылку в вектор, который живёт хз сколько.

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

Ссылка — это противоположность перемещению.

Ничего подобного. В нормальных языках это близкие довольно вещи.

a=someObject
b=a
delete a
вот это и есть перемещение. То что в расте сделано, если верить тс'у — это полный маразм. Интересно, зачем?

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

главный вопрос - можно ли в rust иметь 2 переменные, указывающие на один и тот же объект в хипе, так, чтобы не считать ссылки в рантайме?

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

главный вопрос - можно ли в rust иметь 2 переменные, указывающие на один и тот же объект в хипе, так, чтобы не считать ссылки в рантайме?

Конечно, можно:

let a = Box::new(10);
    
let r1: &i32 = &*a; // указывать тип не обязательно
let r2 = &*a;

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

Спасибо! а если вторая ссылка (как в первом посте) из вектора?

let a = Box::new(10);
my_vector[random_num] = &*a; // теперь на "10" 2 ссылки
my_vector[another_random_num] = &*a; // а теперь либо 2 либо 3, если random_num и another_random_num совпадут
как компилятор в этом случае в компайл-тайм догадается, что Box::new(10) надо будет убирать из памяти?

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

`a` имеет семантику перемещения и уничтожается по выходу из области видимости. Ссылки живут отдельной жизнью. Если ты попробуешь уничтожить `a` пока существуют твои вектора, твой код просто не соберётся.
А вообще, читай Книгу начиная отсюда: http://kgv.github.io/rust_book_ru/src/ownership.html

quantum-troll ★★★★★
()
Ответ на: комментарий от jcdr

а теперь либо 2 либо 3, если random_num и another_random_num совпадут

может наоборот?

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

как компилятор в этом случае в компайл-тайм догадается, что Box::new(10) надо будет убирать из памяти?

Ему не надо догадываться, ссылки не продляют время жизни. Компилятор заставит тебя поправить код, если он будет некорректным. Вот тут вектор живёт (на стеке) меньше, чем Box - всё хорошо.

let a = Box::new(10);
let mut my_vector = ...;
my_vector[random_num] = &*a;
Вот так плохо:
let mut my_vector = ...;
let a = Box::new(10);
my_vector[random_num] = &*a;

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

Ок, давай начнём сначала - что тебе не нравится в «такой» семантике перемещения и что должен был показать твой код?

С семантикой перемещения в плюсах знаком?

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

Просто потому что это не логично и неудобно. если мне нужно иметь несколько ссылок на один и тот же объект, я должен иметь это без костылей. если мне нужна семантика перемещения, мне достаточно написать функцию move. Если я хочу перемещать, я перемещаю, все прозрачно, все логично. Перемещение же по-дефолту является противоречивым поведением.

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

Просто потому что это не логично и неудобно.

Неудобно - возможно. А нелогичного тут что? Везде свои правила и нюансы. Просто непривычно.

Опять же, это даёт дополнительные гарантии. Если ты готов сам за этим следить - пожалуйста, язык позволяет.

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

если мне нужно иметь несколько ссылок на один и тот же объект, я должен иметь это без костылей

Ты просто дурачок, ни разу в жизни не написавший строчки кода на языке без GC.

mix_mix ★★★★★
()

Без stdlib

спрошу тут, чтоб не плодить темы

тут http://kgv.gitbooks.io/rust_book_ru/content/src/no-stdlib.html написано как отключить лишнее, но все равно остается 3 функции: stack_exhausted, eh_personality, panic_fmt. их как-нибудь можно убрать, что бы в итоге вообще ничего лишнего не было, кроме того, что в моем исходнике

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

доставил, улыбнул.

ошибка времени компиляции; ошибка времени выполнения; ответ на некоторое событие, это - азы.

anonymous
()
Ответ на: доставил, улыбнул. от anonymous

такое поведение, как я показал, это стандартное поведение для высокоуровневых языков, с которыми я знаком, в частности JS, Io, Lisp. С низкоуровневыми языками я не знаком, да и не думаю, что они мне когда-нибудь понадобяться, мне скорости за глаза хватает всегда, для моих задач. А что, Rust низкоуровневый язык? В нем нет GC?

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

А что, Rust низкоуровневый язык? В нем нет GC?

Ну, как бы ... хотя нет, вы все равно не поверите. А так да, Rust — высокоуровневый ЯП с GC :)

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

мне скорости за глаза хватает всегда, для моих задач.

Для сранья на ЛОРе?

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

В таком случае, спроси некоторых странных личностей, зачем они подняли тему GC в этом треде.

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

А что, Rust низкоуровневый язык? В нем нет GC?

Он системный, то есть на нём можно писать под bare metal. В нём нет GC. Но есть довольно мощный верификатор, который во время компиляции доказывает отсутствие висячих указателей и неэксклюзивного доступа на запись.

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

Ну так, это все объясняет. Незачем было столько воды лить. Это, видимо ответ на вопрос «почему так сделано в Rust»

jackdempsey2015
()
Ответ на: Без stdlib от anonymous

как-нибудь можно убрать, что бы в итоге вообще ничего лишнего не было, кроме того, что в моем исходнике

Просто из любопытства - чем они тебе мешают?

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

мешать то не мешают, в основном спортивный интерес, хотелось бы полностью контролировать выхлоп. ну и размер бинаря :), или со всяким хламом или без, разница несущественна, но

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

такой ты обмудок тупоголовый :D

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

хотелось бы полностью контролировать выхлоп

Ну реализовывать-то их самому надо, можно пустыми делать, как в примерах в мануале. В этом случае размер особо ведь не вырастет.

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