The OpenNET Project / Index page

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



Индекс форумов
Составление сообщения

Исходное сообщение
"Выпуск языка программирования Rust 1.55"
Отправлено Аноним, 10-Сен-21 21:17 
Прочитал, предполагалась реклама, но для меня оказалась антирекламой.

Цитата:
"The borrow checker can be tricky to understand and work with — so much so that it’s pretty common for newcomers to the Rust community to get stuck fighting the borrow checker. I’ve personally lost many hours of my life to this struggle."

Из этой статьи видно: передача вектора как аргумента в функцию, возможна тремя способами:
1) передачей владения,
2) копией всех данных вектора,
3) по ссылке.

Необходимость передачи владения при передаче аргумента в функцию - очень редко возникающая ситуация (в расте она выполняется по-умолчанию, в отличие от С/С++, которые делают копию).
Чаще всего нужно наоборот - вернуть созданный внутри функции объект наружу.
В примере из статьи этот метод не применим, т.к. вектор используется после вызова функции.
Копировать все данные тоже не вариант - не оптимально. Остается только передать по ссылке.

Подозреваю, что из-за этих ограничений при передаче объектов, использование ссылок в расте (ради оптимальности естественно) распространилось как эпидемия. И для поддержания порядка в этом "генераторе ссылок" понадобился borrow checker.

Для сравнения: С++ предлагает множество вариантов передачи аргументов, в том числе все аналоги раста.
Какой именно больше подходит в конкретном случае, определяется архитектурой приложения.
И можно сделать так, чтобы беспокоиться о ручном освобождении памяти/объектов не нужно было.
Аналоги раста:
1) передача владения - явное использование std::move():  void f(std::unique_ptr<T> arg); f(std::move(object))
2) копия - void f(std::vector<T> array); f(objectsWithCopy)
2) ссылка - void f(std::vector<T> const& objectsByRef); f(objectsNoCopy)

Беспокоиться о ручном освобождении объектов (и появившимся из-за этого невалидных ссылок) не нужно если пользоваться стандартными контейнерами и смарт-пойнтерами.

Еще пример удобного управления временем жизни объектов можно найти в Objective-C: "Autorelease Pool".
Этому механизму уже несколько десятков лет (https://ru.wikipedia.org/wiki/Objective-C#Autorelease-%....
А набор из нескольких простых правил пользования им вполне сходен с правилами которые налагает раст. Отличие в том, что в Objective-C эти правила должны войти в привычку, но оставляют программисту свободу, а раст просто запрещает всё кроме 3-х перечисленных случаев.


Короче, я вижу, что borrow checker - это не очень нужная мне фича, т.к. я уже научился проектировать управление временем жизни объектов и проблем с этим не возникает. Для тех, кто этому не научился, borrow checker - это ложное обещание того, что компилятор решит эти вопросы за них, а он их не решает. Он налагает ограничения (как по мне, слишком жесткие) на владение и передачу объектов, и пока нубы этому не обучатся, будут выгребать "error[E0382]: borrow of moved value" и "I’ve personally lost many hours of my life to this struggle."

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



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

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