#prog #rust #rustreleasenotes
Вышла версия Rust 1.77.0! Как всегда, тут только избранные хайлайты, а полные изменения в ченджлоге.
▪️Асинхронные функции теперь могут быть рекурсивными при условии наличии индирекции. Скажем, такой код по прежнему не работает:
, поскольку асинхронные функции компилируются в стейт-машины, размер которых должен быть известен на этапе компиляции, а размер стека функций явно зависит от рантайм-параметра. Компилятор на это выдаёт относительно хорошую ошибку:
(к сожалению, на сами рекурсивные вызовы не указывает)
Если воспользоваться предложением компилятора, то можно получить вот такой рабочий код:
Можно даже слегка угореть по уменьшению количества аллокаций и сделать так:
▪️В язык добавили строковые литералы типа
Очень удобная вещь для интеропа с C. Эти литералы могут быть сырыми (
▪️Добавили макрос
▪️Для слайсов добавили пачку методов, позволяющих доставать части слайса в виде ссылок на массивы:
🔸
🔸
🔸
🔸
Также добавили методы
▪️Опубликован крейт cargo-util-schemas, который является публичной схемой
▪️Rustdoc теперь поддерживает ссылки в заголовках и позволяет искать по типам, используя естественный синтаксис для кортежей (со скобочками).
Вышла версия Rust 1.77.0! Как всегда, тут только избранные хайлайты, а полные изменения в ченджлоге.
▪️Асинхронные функции теперь могут быть рекурсивными при условии наличии индирекции. Скажем, такой код по прежнему не работает:
async fn fib(n: u32) -> u32 {
match n {
0 | 1 => 1,
_ => fib(n-1).await + fib(n-2).await
}
}
, поскольку асинхронные функции компилируются в стейт-машины, размер которых должен быть известен на этапе компиляции, а размер стека функций явно зависит от рантайм-параметра. Компилятор на это выдаёт относительно хорошую ошибку:
error[E0733]: recursion in an async fn requires boxing
--> src/lib.rs:1:1
|
1 | async fn fib(n: u32) -> u32 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: a recursive `async fn` call must introduce indirection such as `Box::pin` to avoid an infinitely sized future
(к сожалению, на сами рекурсивные вызовы не указывает)
Если воспользоваться предложением компилятора, то можно получить вот такой рабочий код:
async fn fib(n: u32) -> u32 {
match n {
0 | 1 => 1,
_ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await
}
}
Можно даже слегка угореть по уменьшению количества аллокаций и сделать так:
_ => Box::pin(async move { fib(n-1).await + fib(n-2).await }).await
▪️В язык добавили строковые литералы типа
&'static CStr
:use core::ffi::CStr;
const _: &CStr = c"look mum, no trailing nul!";
Очень удобная вещь для интеропа с C. Эти литералы могут быть сырыми (
cr"it is not --> \n <-- a newline"
) и поддерживают escape-последовательности для UTF-8 code point и байтовых значений за пределами ASCII. Символы за пределами ASCII кодируются в том же виде, что и в UTF-8. ▪️Добавили макрос
std::mem::offset_of!
. Пока что поддерживается только в форме смещения поля (полей) от начала раскладки структуры. Технически такой макрос возможно реализовать и сейчас, но для того, чтобы это сделать правильно (без UB), нужно некоторое количество не самого тривиального unsafe
кода.▪️Для слайсов добавили пачку методов, позволяющих доставать части слайса в виде ссылок на массивы:
🔸
slice::first_chunk{, _mut}
🔸
slice::split_first_chunk{, _mut}
🔸
slice::last_chunk{, _mut}
🔸
slice::split_last_chunk{, _mut}
Также добавили методы
slice::chunk_by{, _mut}
, который возвращает итератор из частей слайсов, в которых последовательные пары элементов удовлетворяют предоставленному предикату:let slice = &[1, 1, 1, 3, 3, 2, 2, 2];
let mut iter = slice.chunk_by(|a, b| a == b);
assert_eq!(iter.next(), Some(&[1, 1, 1][..]));
assert_eq!(iter.next(), Some(&[3, 3][..]));
assert_eq!(iter.next(), Some(&[2, 2, 2][..]));
assert_eq!(iter.next(), None);
▪️Опубликован крейт cargo-util-schemas, который является публичной схемой
Cargo.toml
, используемой в самом cargo.▪️Rustdoc теперь поддерживает ссылки в заголовках и позволяет искать по типам, используя естественный синтаксис для кортежей (со скобочками).
👍10
Блог*
#prog #rust #rustreleasenotes Вышла версия Rust 1.77.0! Как всегда, тут только избранные хайлайты, а полные изменения в ченджлоге. ▪️Асинхронные функции теперь могут быть рекурсивными при условии наличии индирекции. Скажем, такой код по прежнему не работает:…
Но мой фаворит — это, конечно, вот это дополнение к weird-exprs.rs
😁8😱2
Блог*
Что ж, попробуем иначе. Пусть встреча будет в... Пятницу. Время — 20:00. Место то же, Vol. 1
У админа перелом воли, встреча отменяется
🤣10🤡5😢3🤷2
Forwarded from Лентач
Президент благотворительного фонда «Волонтёры в помощь детям-сиротам» Елена Альшанская призывает москвичей не спешить сдавать кровь
«Сейчас запасов крови достаточно, а вот через две три недели будет сильно не хватать, а уже никто массово не побежит», — написала она у себя в соцсетях
🤡3❤1
#prog #rust #rustlib #article
Getting meaningful stack traces from Rust tests returning a Result
TL;DR: конвертация в операторе
Великие умы мыслят одинаково, так что автор обнаружил, что на crates.io уже есть крейт testresult, который реализует идею. Тем не менее, там были возможности для улучшения, так что в итоге он сделал PR (главным образом — добавление
Getting meaningful stack traces from Rust tests returning a Result
TL;DR: конвертация в операторе
?
имеет возможность для настройки путём реализации From
/Into
для типа ошибки. Это можно использовать для того, чтобы сделать специальный тип ошибок, который паникует в реализации From::from
, а за счёт #[track_caller]
позволяет даже без бектрейса отловить место, где была создана ошибка.Великие умы мыслят одинаково, так что автор обнаружил, что на crates.io уже есть крейт testresult, который реализует идею. Тем не менее, там были возможности для улучшения, так что в итоге он сделал PR (главным образом — добавление
#[track_caller]
, но также и другие изменения для повышения полезности).Sylvain Wallez
Getting meaningful stack traces from Rust tests returning a Result
I was recently writing a test for a side project in Rust (more on that in a future post) and was frustrated by the lack of information reported when the test fails. I ended up with an interesting hack to report the precise location and error that caused a…
🥰3
#prog #rust хайлайты:
Обнаружение мёртвого кода теперь опирается на эффективную видимость, а не номинальную. Другими словами: сообщения о мёртвом коде стали шире и потому более полезными.
Что интересно, внесение этого изменения позволило удалить несколько
Возможно, когда это докатится до stable, мой совет несколько потеряет в актуальности.
Обнаружение мёртвого кода теперь опирается на эффективную видимость, а не номинальную. Другими словами: сообщения о мёртвом коде стали шире и потому более полезными.
Что интересно, внесение этого изменения позволило удалить несколько
pub
полей в разных местах в самом компиляторе.Возможно, когда это докатится до stable, мой совет несколько потеряет в актуальности.
GitHub
Replace visibility test with reachability test in dead code detection by krtab · Pull Request #119552 · rust-lang/rust
Fixes #119545
Also included is a fix for an error now flagged by the lint
Also included is a fix for an error now flagged by the lint
👍5❤1
#prog #go #article
Go channels are bad and you should feel bad
Статья из 2016 года, поэтому претензии касательно отсутствия дженериков не применимы, а некоторые утверждения касательно устройства стандартной библиотеки могли устареть.
In all of my Go code I work with, I can count on one hand the number of times channels were really the best choice. Sometimes they are. That’s great! Use them then. But otherwise just stop.
Go channels are bad and you should feel bad
Статья из 2016 года, поэтому претензии касательно отсутствия дженериков не применимы, а некоторые утверждения касательно устройства стандартной библиотеки могли устареть.
In all of my Go code I work with, I can count on one hand the number of times channels were really the best choice. Sometimes they are. That’s great! Use them then. But otherwise just stop.
Jtolio
Go channels are bad and you should feel bad | jtolio.com
👎4👍2🤔1
Forwarded from Neural Machine
Мы полностью осознаем, что грядущее — это самое ужасное, что может случиться в мире.
😭6🤔2💯2😁1
#prog #cpp #article
unique_ptr–How Unique is it?
Статья от 2009 года, в которой Бартош Милевски сетует на недостатки unique_ptr и предлагает возможные предложения в язык для исправления ситуации... В виде модификаторов типов unique и lent. Да, весьма похоже на Rust.
unique_ptr–How Unique is it?
Статья от 2009 года, в которой Бартош Милевски сетует на недостатки unique_ptr и предлагает возможные предложения в язык для исправления ситуации... В виде модификаторов типов unique и lent. Да, весьма похоже на Rust.
Bartosz Milewski's Programming Cafe
unique_ptr–How Unique is it?
I’ve been using auto_ptrs before they were available in C++ (I made my own). I wrote several articles about resource management, in which auto_ptr played a prominent role. auto_ptr had always…
😁4🤔1