#prog #rust
Changes to
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
a new default that the hidden types for a return-position
a syntax to declare explicitly what types may be used (usable in any edition).
The new explicit syntax is called a "use bound":
Changes to
impl Trait
in Rust 2024Starting 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).💩3❤2
#prog #article
Store Code Discussions in Git using Git Notes
Эргономика, правда, так себе.
(thanks @rustlang_by)
Store Code Discussions in Git using Git Notes
Эргономика, правда, так себе.
(thanks @rustlang_by)
Wouter J
Store Code Discussions in Git using Git Notes
Code discussions contain relevant information. Isn’t it a shame that we
keep these in the centralized GitHub/GitLab servers, far away from our
decentralized Git code? As soon as we move provider, we’ll lose all old
discussions! And how do you ever find the…
keep these in the centralized GitHub/GitLab servers, far away from our
decentralized Git code? As soon as we move provider, we’ll lose all old
discussions! And how do you ever find the…
❤2👍1🥰1
#prog #rust #article
Defeating Coherence in Rust with Tacit Trait Parameters
TL;DR: чтобы можно было иметь "две различные" реализации трейта для типа, можно добавить в трейт ти́повый параметр, нужный исключительно для придания различия, а чтобы это было эргономичным — сделать тип таким, чтобы его можно было вывести по месту применения. Для функций в качестве такого типа прекрасно работает кортеж аргументов.
Defeating Coherence in Rust with Tacit Trait Parameters
TL;DR: чтобы можно было иметь "две различные" реализации трейта для типа, можно добавить в трейт ти́повый параметр, нужный исключительно для придания различия, а чтобы это было эргономичным — сделать тип таким, чтобы его можно было вывести по месту применения. Для функций в качестве такого типа прекрасно работает кортеж аргументов.
willcrichton.net
Defeating Coherence in Rust with Tacit Trait Parameters
A strategy for working around Rust’s rules that prevent overlapping trait implementations.
❤4
#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