Комментарии 22
Redox OS забыли упомянуть.
Так ему лет-то . На 1.0 он ещё себе не нашкрябал и первый релиз был ещё до выхода стабильного раста, а так новостей там на целый еженедльник, включая OS Dev
По сути никаких фундаментально новых фич в язык уже давно не добавляют, только "стабилизируют", наполняют библиотеки и т.п. Интересно, означает ли это что набор фич в Rust исчерпывающий, и концептуально ничего больше в языке (в общем случае - не только в Rust) не нужно?
А это во всех языках так со временем происходит. И какие-то крупные релизы обычно с появлением новых подходов, либо популяризации старых. Например в JS классы не сразу завезли, потому что сообщество начало требовать сильно позже, и забавно что сейчас наоборот откат от этого, а классы стали структурами по сути. В Ruby иммутабельность немного завезли, потому что популярно стало. Dart убрал поддержку null потому что сейчас считается что правильно без него жить. Ну и Rust не сразу асинхронность принял, хоть и было заложено, не обязательная штука, но для веба это ключевой подход. На фоне раста, вероятно, где-нибудь тоже добавят времена жизни и буст скорости, для части кода. Но пока из прям грандиозных вещей как раз и было изобретение времен жизни, ну и в функциональное программирование перекос произошел. Сложно за всех конечно говорить, может где-то что-то фундаментально крутое появилось, но что-то не очень слышно, так что, похоже, нечего супер крутого особо нести в язык. Не придумали новенького ещё.
С++ до сих пор бурлит, хотя гораздо старше чем Rust:) Рефлексия к примеру.
Dart убрал поддержку null
Что под этим подразумевается? В dart null присутсвует в виде null-safety
Почти наверняка null coalesсing, когда значение неявно (а может и явно) превращается в опционал и в месте использования разворачивается через элвис оператор. А если забыть, то оно тебе ругнётся на несовместимые типы. Хотя не знаю как обстоят дела со строгостью типов в Dart.
В dart переменная должна явно объявляться с типом null
, либо совместимым с ним (dynamic
). Без этого в неё null-значение положить не получится.
String one = 'two'; // инициализация обязательна
String? two; // можно сделать потом
String three;
...
three = two; // нельзя
...
// в обоих случаях ниже компилятор без проверки типов не даст возможности присвоить null в не-null
two = one ?? 'empty'
three = two
...
if (two != null) {
three = two
}
По сути это те же самые опциональные типы.
Есть ещё late
, который позволяет объявить переменную без null
и без инициализации и инициализировать её позже. Ну и падение в рантайме, если это не сделать. Вот это уже и правда довольно спорное решение в языковом дизайней.
Ну, то есть тот же самый null(ish) coalescing, что и в JS/TS, разве что синтаксис маленько разный.
По сути это те же самые опциональные типы.
Как бы да, но нет. С помощью опциональных типов можно выразить, например Option<Option<T>>, а вот с помощью явного null так сделать нельзя.
И чем на выходе это лучше чем "myObject?.MyField?.MySubField" ?
Не совсем понял, при чём тут показанный синтаксис, по тому не буду говорить, чем возможность вкладывать Option в Option лучше или хуже этого.
На выходе - просто можно выражать немного другие идеи.
Первое что в голову пришло - можно выразить:
Пользователь не установил значение
Пользователь указал значение
Пользователь указал явно null
При парсинге ещё может быть полезно для случаев, когда нужно указать, что что-то не удалось спарсить (None) или спарсился null (Some(None). Или чтобы различать ситуации, когда поля в json нет и когда оно явно обозначено как null без ухода в DOM API.
а у этого есть какое-либо применение?
Да. Допустим, у нас в данных уже есть опциональное поле, и эти данные нужно уметь выборочно патчить. В таком случае приходится каждое поле делать, э-э-э, ещё более опциональным чем было.
Иными словами:
Some(Some(foo))
- команда "установи атрибут в значение foo"Some(None)
- команда "сотри атрибут"None
- команда "ничего не делай с атрибутом"
Во многом да, но новое всё таки планируется. Например, генераторы. Уже сейчас в следующей редакции застолбили за ними ключевое слово https://doc.rust-lang.org/nightly/edition-guide/rust-2024/gen-keyword.html
фичи добавляют, но включают только в nightly сборках. Там она обкатывается добровольцами, полируется, и в итоге либо стабилизируется либо выпиливается
В целом Rust старается релизить изменения постепенно, в идеале крупные ещё и по частям (т.к. они часто друг от друга зависит)
сначала проект переводится в Mini-C, где исключены операции с указателями
А в чём смысл? В какой вселенной существует С-программа или библиотека без операций с указателями???
P.S. Нашёл в более точном переводе:
Си-проект в представление на Mini-C, в котором не допускаются арифметические операции с указателями
Но всё равно, нет ни какой разницы что неявно использовать арифметику указателей через arr[-4], что через arr-4.
Поясните, пожалуйста, новичку. И если не затруднит, дайте ссылку на этот самый Mini-C
https://arxiv.org/abs/2412.15042
Взял ссылку отсюда:
https://www.opennet.ru/opennews/art.shtml?num=62550
А статья opennet, видимо, перепост вот этой:
https://www.securitylab.ru/news/555706.php
А так, еще в 2016 году пытались уже транслятор сделать из С в Rust:
https://www.linux.org.ru/news/opensource/12988948?ysclid=m68102ifjl314958842
Rust 1.84: новый релиз отличного языка программирования. Еще лучше, еще эффективнее, как всегда