The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Выпуск языка программирования Rust 1.49, opennews (??), 02-Янв-21, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


62. "Выпуск языка программирования Rust 1.49"  +2 +/
Сообщение от Аноним (56), 02-Янв-21, 17:35 
Хаха, люди. Вы реально хотябы почитайте что такое Rust и с чем его едят..

В rust есть СВОЕ понятие ссылок (нет, это не си ссылки) это так называемые безопасные указатели. Они используются в 99% случаях в вашем коде

это &T и &mut T

Данные ссылки не бывают null, их разыменовывать можно, имеют лайфтаймы (тоесть управляемые времена жизни).


А есть unsafe это уже действительно сишные СЫРЫЕ указатели (прямо то что и написано в отрывке вашей документации)

это *const T и *mut T
Они могут быть и null, всегда без лайфтаймов, и работать с ними нормально можно лишь ЧЕРЕЗ UNSAFE. Если не использовать безопасные обертки для этих указателей, то rust будет автоматически проверять данное на null и делать разные другие контролируемые вещи...

А лайфтаймы нужны для контроля освобождения и запрета разрабу использования освобожденной памяти, заимствованой памяти... Одновременное обращение к & в то время когда есть &mut и другое...

Ответить | Правка | К родителю #4 | Наверх | Cообщить модератору

119. "Выпуск языка программирования Rust 1.49"  +1 +/
Сообщение от Аноним (118), 03-Янв-21, 02:15 
По-моему вы малость перевираете.

Обычная переменная в Rust - это аналог умного указателя std::unique_ptr из C++11. Константного или неконстантного - с mut.
А вот заимствование '&' - это почти тоже, что и ссылка в С++, где она также не должна ссылаться в никуда. Только в Rust мы ссылаемся на умные указатели, которые на момент доступа по ссылке могут быть "пустыми", передавшими свое значение. Тогда Rust, чтобы обеспечить заявленные гарантии безопасности, следит и заставляет следить программиста за временем жизни всех ссылок и "переменных", на которые те ссылаются. Отсюда все эти одинарные кавычки в прототипах функций и танцы с вложенными блоками {}.

Я, правда, дальше чтения документации не уходил. Может, кто-то практикующий Rust меня поправит, будет всем полезно.

Ответить | Правка | Наверх | Cообщить модератору

121. "Выпуск языка программирования Rust 1.49"  +/
Сообщение от red75prim (?), 03-Янв-21, 03:25 
Обычная переменная в Rust - это обычная переменная и лежит на стеке, если её оптимизатор не положит в регистр. Перемещения значения из переменной ничего не делает с содержимым памяти, в котором это значение лежало. Отсутствие обращений к переменной, из которой было перемещено значение, проверяется только во время компиляции.

Заимствование в Rust - это не ссылка из C++. Семантически, ссылка в C++ - это другое имя (alias) для какой-то переменной. Поэтому в С++ запрещено брать адрес ссылки, например. В Rust заимствование - это указатель на память, с дополнительным гарантиями: указывает на валидное значение, нет алиасинга мутабельных указателей. Лайфтаймы ("одинарные кавычки") - это средство обеспечения указанных гарантий во время компиляции.

Ответить | Правка | Наверх | Cообщить модератору

122. "Выпуск языка программирования Rust 1.49"  +/
Сообщение от Аноним (118), 03-Янв-21, 05:16 
Спасибо за пояснения.

Ожидаемо, что паттерн "уникальный умный указатель" реализован в Rust более эффективно, как compile-time проверки компилятора над действиями с именнованными областями памяти, нежели, как исторически сложилось в С++, средствами обобщенного программирования. Однако, область применения ведь аналогична юникам из плюсов (а не переменным)?

С заимствованиями, в общем тоже не нашел противоречий по временам жизни. Но аналогия с указателями С++, мне всё же кажется неточной. Ведь мы же не можем поменять заимствованный адрес? Только затенить связанное имя? То есть, не вдаваясь в детали реализации, это всё же больше похоже на ссылку из С++, где, в отличие от указателя, имя жестко связано со значением, а разыменования неявны.

P.S. Ох. Надо начинать практиковаться, пока всё прочитанное из головы не выветрилось или не перемешалось. Пользуясь случаем, не посоветуете Rust IDE (с поддержкой Linux)? Пробовал Gnome Builder и QtCreator. Но всё какое-то гвоздями приколоченное, на честном слове, работает через раз. А я ведь дальше хеллоуворлда, запущенного под отладчиком не уходил. На чём вообще работают программисты Rust? Плагины для тяжеловесных полупроприетарных Java IDE? Плагины для блокнотов/вимов/емаксов? Или есть какая-то секретная, открытая, идиоматичная IDE-мечта?

Ответить | Правка | Наверх | Cообщить модератору

123. "Выпуск языка программирования Rust 1.49"  +/
Сообщение от red75prim (?), 03-Янв-21, 05:47 
> Однако, область применения ведь аналогична юникам из плюсов (а не переменным)?

Разделение точно такое же как в C++. Переменные лежат на стеке, уники (в расте Box) указывают на аллоцированный объект и владеют им. Отличие в том, что move семантика в расте применяется к переменным содержащим значения, которые нельзя тривиально скопировать (не Copy типы). Переменные, содержащие значения Copy-типов в расте соответствуют переменным в С++ с тривиальными конструкторами копирования.

> Ведь мы же не можем поменять заимствованный адрес?

Можем и поменять и разыменование явное. Единственное, что похоже на ссылку - гарантия валидности значения на которое указывает заимствование.

let a=1;
let b=2;
let mut reference = &a;
reference = &b; // поменяли адрес
let c = *reference; // разыменование явное


> Пользуясь случаем, не посоветуете Rust IDE (с поддержкой
> Linux)?

Я пользуюсь VS Code с плагином rust analyzer. Rust analyzer ещё работает с vim, emacs, sublime и gnome builder, но их не пробовал.

Ответить | Правка | Наверх | Cообщить модератору

132. "Выпуск языка программирования Rust 1.49"  +/
Сообщение от Аноним (118), 03-Янв-21, 09:59 
А, разобрался. Действительно, unique_ptr<T> - более специфичен из-за выделения памяти под объект типа T в куче.
Остановлюсь на том, что переменные в языках схожи. Если тип реализует типаж Copy, то конструктор тривиальный-копирующий, нет - перемещающий.

По второму вопросу, сбило с толку, что ```fn ln(s: &str) -> usize { s.len() }``` без явного разыменования ```(*s).len()```. Но в вызове функции ```ln(&"hello");``` и других местах, оно действительно выглядит как передача адреса указателю в С++. Проморгал, каюсь.

> VS Code

Эх, у меня аллергия на продукты, содержащие Javascript. :) Придётся, поискать что-то ещё.

В общем, спасибо. Буду изучать. Уж больно этот Rust интересный и многообещающий язык, не на Опеннете будет сказано.

Ответить | Правка | Наверх | Cообщить модератору

138. Скрыто модератором  –1 +/
Сообщение от Аноним (138), 03-Янв-21, 13:13 
Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру