The OpenNET Project / Index page

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



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

Исходное сообщение
"Релиз языка программирования Rust 2021 (1.56) "
Отправлено burjui, 26-Окт-21 10:44 
> меня вполне устроит неформальное доказательство ("на пальцах") при отсутствии формальной
> семантики языка

Для этого достаточно открыть документацию по владению и лайфтаймам. Вкратце, раньше было так:

struct X {
    a: i32,
    b: i32,
}

let x = X { a: 0, b: 0 };
let f = || x.a + 1;
// Это не скомпилируется в версиях ниже 1.56, потому что x целиком захвачен по ссылке в f
let g = || x.b + 1;

Теперь g тоже скомпилируется, т.к. в f захватится только то, что нужно - x.a, а в g - x.b
Напомню, что "захватить" (взять ссылку на) часть структуры можно было и раньше:

let xa = &x.a;
let xb = &x.b;

Более того, можно даже одно поле захватить, а другое переместить:

let xa = &x.a;
some_function(x.b);

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

> Это изменение действительно выглядит крайне естественно (и да, тривиально) с точки зрения
> пользователя данного конкретного частного случая. А как оно будет выглядеть с
> точки зрения пользователей других частных случаев, причем не только в текущей
> версии языка, но и во всех последующих его версиях? Вот правильный
> вопрос.

https://blog.rust-lang.org/2021/10/21/Rust-1.56.0.html:

This new behavior is only activated in the new edition, since it can change the order in which fields are dropped. As for all edition changes, an automatic migration is available, which will update your closures for which this matters by inserting let _ = &a; inside the closure to force the entire struct to be captured as before.

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

> Анонимус написал об обратной совместимости. Это полезно, и тоже стоит обдумать, но
> мне кажется, что у правильно спроектированного языка вообще не должно возникать
> проблем обратной совместимости при его развитии.

С этим полный порядок, т.к. изменение вносится в рамках 2021 edition, а значит, старый код компилируется по-старому (2015 & 2018 editions), а новый код не меняет семантику, поэтому может использоваться из старого.

https://doc.rust-lang.org/edition-guide/editions/index.html:

The most important rule for editions is that crates in one edition can interoperate seamlessly with crates compiled in other editions. This ensures that the decision to migrate to a newer edition is a "private one" that the crate can make without affecting others.

The requirement for crate interoperability implies some limits on the kinds of changes that we can make in an edition. In general, changes that occur in an edition tend to be "skin deep". All Rust code, regardless of edition, is ultimately compiled to the same internal representation within the compiler.

Как видите, ничего страшного не произошло, и те, кому эта фича не нужна, даже не заметят, что автор библиотеки её использует, пока не заглянут в Cargo.toml

Я ж говорю: всё есть в документации, только кто ж её читает? 🤓

> ОК, хорошо, крест на языке как конкуренте С++ для тех, кто может
> выбирать.

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

 

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



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

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