#prog #rust #article
The borrowchecker is what I like the least about Rust
Не со всем согласен, но большинство аргументов здравые.
The borrowchecker is what I like the least about Rust
Не со всем согласен, но большинство аргументов здравые.
In this post, I want to make two arguments:
1. That the borrowchecker causes serious ergonomic problems for Rust.
2. That the role of the borrowchecker in Rust's safety is overstated.
Perversely, because Rust's lifetime riddles are challenging, they are sort of fun. I believe that partly explains why so many people don't seem to mind them. Instead of thinking about how to write my code to solve the scientific problems I'm being paid to solve, I have to think about how to write it to please the borrowchecker. The latter is usually more tractable, limited in scope, have clearer requirements and is more 'puzzle-like'. In that sense, Rust enables escapism: When writing Rust, you get to solve lots of 'problems' - not real problems, mind you, but fun problems.
👍10🤡5👎1😐1
#prog #rust #rustreleasenotes
Вышла версия Rust 1.89.0! Как всегда, тут только избранные части, остальное — в детальных заметках о релизе.
▪️Стабилизировали вывод const generics в выражениях!
К сожалению, использовать
▪️Док-тесты теперь запускаются при кросс-компиляции.
▪️Атрибуты вида
▪️После фиксов для согласования с существующими компиляторами C/C++ теперь можно использовать
▪️Как я уже писал, продление времени жизни временных значений теперь работает и с кортежными конструкторами (кортежных структур и кортежных вариантов
▪️Стабилизированы интринсики (и связанные с ними target feature [1], [2]) из наборов инструкций AVX512, SHA512, SM3 и SM4 для x86-64.
▪️Макро-фрагмент в декларативных макросах без указанного типа теперь является ошибкой компиляции на всех edition.
▪️Результат вычисления format_args! теперь можно сохранять в переменных!🎉
▪️
▪️
▪️К слову о локах, для
▪️
Вышла версия Rust 1.89.0! Как всегда, тут только избранные части, остальное — в детальных заметках о релизе.
▪️Стабилизировали вывод const generics в выражениях!
pub fn all_false<const LEN: usize>() -> [bool; LEN] {
[false; _]
}
К сожалению, использовать
_
для const generics в сигнатурах всё ещё нельзя.▪️Док-тесты теперь запускаются при кросс-компиляции.
▪️Атрибуты вида
#![doc(test(attr(..)))]
(которые добавляют #[attr(..)] ко всем док-тестам в модуле) теперь можно использовать везде, включая корень крейта.▪️После фиксов для согласования с существующими компиляторами C/C++ теперь можно использовать
i128
и u128
в extern "C"
определениях, интероп корректно работает и, как следствие, improper_ctypes_definitions
более не триггерится.▪️Как я уже писал, продление времени жизни временных значений теперь работает и с кортежными конструкторами (кортежных структур и кортежных вариантов
enum
-ов).▪️Стабилизированы интринсики (и связанные с ними target feature [1], [2]) из наборов инструкций AVX512, SHA512, SM3 и SM4 для x86-64.
▪️Макро-фрагмент в декларативных макросах без указанного типа теперь является ошибкой компиляции на всех edition.
▪️Результат вычисления format_args! теперь можно сохранять в переменных!
▪️
std::array::IntoIter
теперь реализовывает Default. Значение по умолчанию при этом является итератором, который ничего не возвращает. Полезно, когда нужно предоставить итерацию по опциональному массиву и при этом не хочется прокидывать Option
в возвращаемое значение.▪️
LazyCell
и LazyLock
теперь реализуют DerefMut. Одной причиной использовать once_cell
меньше.▪️К слову о локах, для
File
теперь есть пачка методов ({, try_}lock{, _shared}
и unlock
) для работы с платформо-специфичными способами блокировки файлов. Напоминаю, что на Linux эти функции требуют кооперации: коду нужно явно указывать на то, что он обращает внимание на блокировки, а по умолчанию они ничего для сторонних процессов не делают.▪️
NonNull
можно безопасно создать из ссылки, поскольку ссылки в Rust обязаны не быть null. Для этого есть реализация From<&T> for NonNull<T>
. К сожалению, этот способ конвертации не очень очевиден, и на практике многие писали код с NonNull::new_unchecked
, в котором ссылка приводилась к сырому указателю по месту вызова. Видимо, чтобы сделать безопасный способ конвертации более видимым и очевидным в исходниках, к NonNull
добавили конструктор from_ref (и from_mut для конвертации из &mut T
). Также этому типу добавили методы для работы с provenance (expose_provenance, with_exposed_provenance, without_provenance), которые аналогичны таковым для сырых указателей, но принимают/возвращают NonZero<usize>
вместо usize
.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3❤2
#prog #rust #article
Can Rust prevent logic errors?
TL;DR: да, потому что в Rust есть для этого средства, которые отсутствуют в подавляющем большинстве мейнстримных ЯП. Автор, впрочем, сравнивает в основном с Ruby.
Предотвращаемые ошибки показаны с примерами на других ЯП.
Can Rust prevent logic errors?
TL;DR: да, потому что в Rust есть для этого средства, которые отсутствуют в подавляющем большинстве мейнстримных ЯП. Автор, впрочем, сравнивает в основном с Ruby.
Предотвращаемые ошибки показаны с примерами на других ЯП.
❤🔥3
#rust
Vitaly Reads: #3, August 2025
(thanks, разумеется, @bravit)
Vitaly Reads: #3, August 2025
I’ve just completed reading an amazingly well-written book called “Refactoring to Rust” by Lily Mara and Joel Holmes, published recently by Manning Publications. I’m pretty sure that the book was supposed to be called “Rewrite it to Rust,” but then someone realized that this is already a meme, so it’d be too much.
Yet, the goal is exactly that – to teach folks how to gradually introduce Rust components to their existing codebases written in C/C++, Java, Python, or JavaScript. Such a goal reflects the intended audience: developers in those languages with little or no knowledge of Rust. One interesting thing, though, is that even Rust professionals might find a lot of interesting details about Rust itself, especially if they are not experienced in such areas as FFI (Foreign Function Interface), Rust-Python interoperability, or WebAssembly – those are the key topics of the book.
(thanks, разумеется, @bravit)
🥰7👍4
#prog #rust #article
Fully Automated Releases for Rust Projects
Статья с очень конкретными инструкциями
Fully Automated Releases for Rust Projects
Статья с очень конкретными инструкциями
🔥4
#prog #rust #suckassstory
std::process::exit is not thread-safe in combination with C code calling exit
Древний дизайн из времён, когда многопоточности не существовало, вновь наносит удар! И да, проблемы те же, что и с
std::process::exit is not thread-safe in combination with C code calling exit
Древний дизайн из времён, когда многопоточности не существовало, вновь наносит удар! И да, проблемы те же, что и с
env::{set_var, remove_var}
.😁4
#prog #rust хайлайты:
Реализовали derive через macro_rules!-макросы. Учитывая, насколько часто код, генерируемый derive, весьма простой, это позволит сильно упростить их написание, а также избежать выделения отдельного крейта только под процедурный макрос и, разумеется, не компилировать макрос в отдельную программу, которая общается с компилятором по RPC.
Реализовали derive через macro_rules!-макросы. Учитывая, насколько часто код, генерируемый derive, весьма простой, это позволит сильно упростить их написание, а также избежать выделения отдельного крейта только под процедурный макрос и, разумеется, не компилировать макрос в отдельную программу, которая общается с компилятором по RPC.
GitHub
Implement declarative (`macro_rules!`) derive macros (RFC 3698) by joshtriplett · Pull Request #145208 · rust-lang/rust
This is a draft for review, and should not be merged yet.
This is layered atop #145153 , and has
only two additional commits atop that. The first handles parsing and provides a
test for various par...
This is layered atop #145153 , and has
only two additional commits atop that. The first handles parsing and provides a
test for various par...
❤5👍4🤯2🔥1