Telegram Web
#prog #rust

Changes to impl Trait in Rust 2024

Starting in Rust 2024, we are changing the rules for when a generic parameter can be used in the hidden type of a return-position impl Trait:

a new default that the hidden types for a return-position
impl Trait can use any generic parameter in scope, instead of only types (applicable only in Rust 2024);
a syntax to declare explicitly what types may be used (usable in any edition).

The new explicit syntax is called a "use bound":
impl Trait + use<'x, T>, for example, would indicate that the hidden type is allowed to use 'x and T (but not any other generic parameters in scope).
Forwarded from Neural Machine
Банан?
#prog #rust #article

Defeating Coherence in Rust with Tacit Trait Parameters

TL;DR: чтобы можно было иметь "две различные" реализации трейта для типа, можно добавить в трейт ти́повый параметр, нужный исключительно для придания различия, а чтобы это было эргономичным — сделать тип таким, чтобы его можно было вывести по месту применения. Для функций в качестве такого типа прекрасно работает кортеж аргументов.
#meme про XML
#prog #rust #rustreleasenotes

Вышла версия 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 может вызвать панику.
▪️Кстати, насчёт паник: вывод паник (по крайней мере, с panic hook по умолчанию) теперь предотвращает перемешивание вывода, если паникуют несколько потоков одновременно.

▪️Ещё касательно паник: 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}
#prog

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, например).
http://cpu.land — ресурс, рассказывающий о том, как именно происходит запуск программ в компьютере. К сожалению, практически всё, что касается OS — Linux-специфично. Но даже так всё равно познавательно
Ну, #meme про людей в IT
Forwarded from Trap ~ езные мемы😇 (ᴀᴍᴋஇ)
🌝

https://mailman.nginx.org/pipermail/nginx-ru/2024-September/JO5YGKLOQA6RZ43PIDOEVFOHV4ON6RCM.html

До этого NGINX жил тут
https://trac.nginx.org/

ЗЫ Какие же тёплые ностальгические чувства вызывает Trac. В своё время был отдушиной прям.
А зачем питонячьи тулзы типа пипа и конды делают намеренно неудобными? Нормально же можно было pip install делать системно, нахера было прекращать? Предыдущий опыт работы с кондой отправил конду на свалку. Понадобилось потрогать её снова — глумится, блядь ехидная
Блог* pinned «http://cpu.land — ресурс, рассказывающий о том, как именно происходит запуск программ в компьютере. К сожалению, практически всё, что касается OS — Linux-специфично. Но даже так всё равно познавательно»
Forwarded from Neural Machine
Зря твой мозг не боится Интернета.
Forwarded from eternal classic
2024/09/11 07:35:13
Back to Top
HTML Embed Code: