#prog #rust #rustreleasenotes
Вышла версия Rust 1.81.0! Как всегда,котлеты детальные заметки о релизе отдельно, а мухи мои хайлайты отдельно.
▪️Компилятор теперь несколько иначе выводит лайфтаймы. Раньше при наличии
▪️Ещё насчёт лайфтаймов: компилятор теперь по умолчанию не компилирует код с ассоциированными константами с лайфтаймами в типах, если есть именованные лайфтаймы в текущей области видимости:
▪️Стабилизировали атрибут
Эта вещь особенно полезна при написании чернового варианта кода. В отличие от
▪️Ещё изменение касательно атрибутов для линтов: если подобный линт вызывает предупреждение компилятора, то оно теперь непосредственно включает сообщение из
Вывод:
Строка
▪️У большинства вариантов ABI в Rust есть
▪️
▪️
▪️До стейбла дошли улучшения сортировок. Да, теперь ваш говнокод в реализации
Вышла версия Rust 1.81.0! Как всегда,
▪️Компилятор теперь несколько иначе выводит лайфтаймы. Раньше при наличии
self
компилятор выводил время жизни из ссылки на Self
, если оно было. Теперь компилятор ищет ссылку не непосредственно на Self
, а на тип, включающий в себя Self
, и прерывает компиляцию, если в типе self
больше одного лайфтайма. Примеры из PR:// ранее компилировалось, а теперь нет
fn a(self: &Box<&Self>) -> &u32
fn b(self: &Pin<&mut Self>) -> &String
fn c(self: &mut &Self) -> Option<&Self>
fn d(self: &mut &Box<Self>, arg: &usize) -> &usize
// ранее не компилировалось, теперь компилируется
fn f(self: &Box<Self>) -> &u32
// компилируется, но теперь выбирает иной лайфтайм
fn e(self: &mut Box<Self>, arg: &usize) -> &usize
// ^ теперь ^ раньше
▪️Ещё насчёт лайфтаймов: компилятор теперь по умолчанию не компилирует код с ассоциированными константами с лайфтаймами в типах, если есть именованные лайфтаймы в текущей области видимости:
struct Foo<T>(T);
impl<'a> Foo<&'a ()> {
const STR: &str = "hello, world"; // низзя (но можно #[allow], если хочется)
}
impl Foo<()> {
const STR: &str = "hello, world"; // можно, других лт нет, выводится 'static
}
▪️Стабилизировали атрибут
#[expect]
, который заставляет компилятор выдавать предупреждение, если указанный линт не срабатывает. Пример:fn consume(_: i32) {
todo!()
}
pub fn foo() {
let mut x = 0; // warning: variable does not need to be mutable
consume(x);
}
pub fn bar() {
#[expect(unused_mut)]
let mut x = 0; // нет предупреждений
consume(x);
}
Эта вещь особенно полезна при написании чернового варианта кода. В отличие от
#[allow]
, компилятор будет выдавать предупреждение, когда весь код, вызывающий срабатывание указанного линта, будет исправлен.▪️Ещё изменение касательно атрибутов для линтов: если подобный линт вызывает предупреждение компилятора, то оно теперь непосредственно включает сообщение из
reason
:fn consume(_: i32) {}
#[deny(unused_mut, reason = "mutability is evil")]
pub fn f() {
let mut x = 0;
consume(x);
}
Вывод:
error: variable does not need to be mutable
--> src/lib.rs:5:9
|
5 | let mut x = 0;
| ----^
| |
| help: remove this `mut`
|
= note: mutability is evil
note: the lint level is defined here
--> src/lib.rs:3:8
|
3 | #[deny(unused_mut, reason = "mutability is evil")]
Строка
= note: mutability is evil
ранее отсутствовала в выводе.▪️У большинства вариантов ABI в Rust есть
*-unwind
варианты, которые позволяют паникам пересекать границу FFI. Для вариантов ABI без *-unwind
такое поведение является UB. В этой версии Rust программа теперь прекращает работу (abort), когда паника пересекает границу ABI, не поддерживающего раскрутку стека.▪️
offset_from
теперь можно всегда применять на указателях с одинаковыми адресами, вне зависимости от их происхождения (provenance). Да, в том числе на указателях из разных аллокаций. Сделано это для достижения provenance monotonicity: добавления произвольного provenance указателям не может добавить UB в программу, в которой UB не было.▪️
{Rc,Arc}::make_mut()
теперь работают на слайсах из клонируемых значений. Реализовано через отдельный нестабильный трейт, так что для своих типов реализовать не получится, увы.▪️До стейбла дошли улучшения сортировок. Да, теперь ваш говнокод в реализации
Ord
может вызвать панику.👍3
▪️Кстати, насчёт паник: вывод паник (по крайней мере, с panic hook по умолчанию) теперь предотвращает перемешивание вывода, если паникуют несколько потоков одновременно.
▪️Ещё касательно паник:
As argument to the
As argument to the panic hook in std context.
In situation 1, the
In situation 2, the
...
I don't see any good reasons for these to be the same type, other than historical reasons.
Как следствие,
▪️И ещё насчёт паник:
▪️Стабилизировали новые API, в том числе:
🔸 core::error. Да, само по себе это не новое API, но трейт
🔸hint::assert_unchecked — вызывает UB, если аргумент является
🔸fs::exists — фактически алиас для Path::try_exists, не переводит ошибки в
🔸AtomicBool::fetch_not
🔸Duration::abs_diff
В const-контексте теперь можно вызывать:
🔸
🔸
▪️Ещё касательно паник:
PanicInfo
разделили на два типа. Первый, в core, используется как аргумент в #[panic_handler]
(вне #![no_std]
не актуально), а второй, в std (переименованный в PanicHookInfo
) как аргумент для хука паники. Как пишет Мара Бос:
PanicInfo
is used in two ways:As argument to the
#[panic_handler]
in no_std
context.As argument to the panic hook in std context.
In situation 1, the
PanicInfo
always has a message (of type fmt::Arguments
), but never a payload (of type &dyn Any
).In situation 2, the
PanicInfo
always has a payload (which is often a String
), but not always a message....
I don't see any good reasons for these to be the same type, other than historical reasons.
Как следствие,
std::panic::PanicInfo
теперь является алиасом (с #[deprecated]
) на PanicHookInfo
.▪️И ещё насчёт паник:
PanicInfo
(который в core) обзавёлся новым методом message, который возвращает новый тип PanicMessage, реализующий Display
. Да, сейчас это тонкая обёртка над fmt::Arguments.▪️Стабилизировали новые API, в том числе:
🔸 core::error. Да, само по себе это не новое API, но трейт
Error
теперь можно использовать в #![no_std]
🔸hint::assert_unchecked — вызывает UB, если аргумент является
false
. Может быть полезно для того, чтобы сообщать оптимизатору инварианты, которые компилятор сам не выводит.🔸fs::exists — фактически алиас для Path::try_exists, не переводит ошибки в
false
.🔸AtomicBool::fetch_not
🔸Duration::abs_diff
В const-контексте теперь можно вызывать:
🔸
char::from_u32_unchecked
(и метод, и функцию в core::char
)🔸
CStr::{
count_bytes,
from_ptr}
👍3
Блог*
#prog #rust #rustreleasenotes Вышла версия Rust 1.81.0! Как всегда, котлеты детальные заметки о релизе отдельно, а мухи мои хайлайты отдельно. ▪️Компилятор теперь несколько иначе выводит лайфтаймы. Раньше при наличии self компилятор выводил время жизни из…
GitHub
`#[expect(unused_must_use)]` does not work when applied directly to statement · Issue #130142 · rust-lang/rust
I tried this code: #[must_use] pub fn important() -> i32 { 42 } pub fn foo() { #[expect(unused_must_use)] important(); } I expected #[expect] to catch unused_must_use lint and suppress it, as it...
😭7👍3😁3🤔2
#prog
Frangipanni — program to convert lines of text into beautiful tree structures.
Пример. Вход:
Вывод:
Можно также выводить в JSON и вручную задавать разделители.
Попенять можно разве что за длинные ключи с одиночными дефисами вместо удвоенных (т. е. ключи как в find, например).
Frangipanni — program to convert lines of text into beautiful tree structures.
Пример. Вход:
/etc/bluetooth/rfcomm.conf.dpkg-remove
/etc/bluetooth/serial.conf.dpkg-remove
/etc/bluetooth/input.conf
/etc/bluetooth/audio.conf.dpkg-remove
/etc/bluetooth/network.conf
/etc/bluetooth/main.conf
/etc/fish
/etc/fish/completions
/etc/fish/completions/task.fish
Вывод:
etc
bluetooth
rfcomm.conf.dpkg-remove
serial.conf.dpkg-remove
input.conf
audio.conf.dpkg-remove
network.conf
main.conf
fish/completions/task.fish
Можно также выводить в JSON и вручную задавать разделители.
Попенять можно разве что за длинные ключи с одиночными дефисами вместо удвоенных (т. е. ключи как в find, например).
🥰6👍4❤1🔥1😱1🤡1
https://cpu.land — ресурс, рассказывающий о том, как именно происходит запуск программ в компьютере. К сожалению, практически всё, что касается OS — Linux-специфично. Но даже так всё равно познавательно
Putting the "You" in CPU
Curious exactly what happens when you run a program on your computer? Learn how multiprocessing works, what system calls really are, how computers manage memory with hardware interrupts, and how Linux loads executables.
🔥15👍4👎1
Forwarded from Технологический Болт Генона
🌝
https://mailman.nginx.org/pipermail/nginx-ru/2024-September/JO5YGKLOQA6RZ43PIDOEVFOHV4ON6RCM.html
До этого NGINX жил тут
https://trac.nginx.org/
ЗЫ Какие же тёплые ностальгические чувства вызывает Trac. В своё время был отдушиной прям.
https://mailman.nginx.org/pipermail/nginx-ru/2024-September/JO5YGKLOQA6RZ43PIDOEVFOHV4ON6RCM.html
До этого NGINX жил тут
https://trac.nginx.org/
ЗЫ Какие же тёплые ностальгические чувства вызывает Trac. В своё время был отдушиной прям.
👍7👎1
Forwarded from Кресты на моей кукухе
А зачем питонячьи тулзы типа пипа и конды делают намеренно неудобными? Нормально же можно было pip install делать системно, нахера было прекращать? Предыдущий опыт работы с кондой отправил конду на свалку. Понадобилось потрогать её снова — глумится, блядь ехидная
😁10👍8❤1👎1🤡1
#prog #rust #article
Is this trait sealed, or not sealed — that is the question
В Rust есть идиома под названием sealed trait. Этим называют трейт, который обычно предназначен для использования в публичном API, но при этом имплы которого не могут быть написаны вне крейта, в котором он определён. В данной статье рассказывается о том, как новая версия cargo-semver-checks 0.35 понимает, что трейт является запечатанным. Ответ на этот вопрос не самый прямолинейный и содержит граничные случаи внутри граничных случаев внутри граничных случаев.
Is this trait sealed, or not sealed — that is the question
В Rust есть идиома под названием sealed trait. Этим называют трейт, который обычно предназначен для использования в публичном API, но при этом имплы которого не могут быть написаны вне крейта, в котором он определён. В данной статье рассказывается о том, как новая версия cargo-semver-checks 0.35 понимает, что трейт является запечатанным. Ответ на этот вопрос не самый прямолинейный и содержит граничные случаи внутри граничных случаев внутри граничных случаев.
predr.ag
Is this trait sealed, or not sealed — that is the question
Detecting sealed Rust traits allows many new SemVer lints. Why did building it take so long?
#math #video
How good is advantage in D&D?
Видео, которое со всех сторон рассматривает статистические эффекты преимущества и помехи на броски в Dungeons&Dragons — в частности, пытается прикинуть, каким модификатором их можно заменить. Если вам непонятны термины выше — спокойно, у видео есть вводная, которая это всё объясняет.
How good is advantage in D&D?
Видео, которое со всех сторон рассматривает статистические эффекты преимущества и помехи на броски в Dungeons&Dragons — в частности, пытается прикинуть, каким модификатором их можно заменить. Если вам непонятны термины выше — спокойно, у видео есть вводная, которая это всё объясняет.
YouTube
How good is Advantage in D&D?
Can we equate rolling with advantage in Dungeons and Dragons to a flat modifier? Let's ask this kenku we pulled off the street. Oh no, they're going on a long-winded tangent on probability...
(Note for commenters: I am aware that rolling a 1 is automatically…
(Note for commenters: I am aware that rolling a 1 is automatically…
🔥3
#prog #rust #rustasync #article
Async Rust can be a pleasure to work with (without Send + Sync + 'static)
<...> How? Through a combination of Structured Concurrency and thread-per-core async runtimes.
Async Rust can be a pleasure to work with (without Send + Sync + 'static)
<...> How? Through a combination of Structured Concurrency and thread-per-core async runtimes.
Evan Schwartz
Async Rust can be a pleasure to work with (without `Send + Sync + 'static`)
Async Rust is powerful. And it can be a pain to work with (and learn). Async Rust can be a pleasure to work with, though, if we can do it without `Send + Sync + 'static`.
👍7🥰1
#prog #sql #abnormalprogramming
github.com/nuno-faria/tetris-sql
Using SQL's Turing Completeness to Build Tetris
(thanks @nosingularity)
github.com/nuno-faria/tetris-sql
Using SQL's Turing Completeness to Build Tetris
(thanks @nosingularity)
GitHub
GitHub - nuno-faria/tetris-sql: Using SQL's Turing Completeness to Build Tetris
Using SQL's Turing Completeness to Build Tetris. Contribute to nuno-faria/tetris-sql development by creating an account on GitHub.
🤯5