#prog #rust #article
Enter paradis — A new chapter in Rust's parallelism story
Из-за правил относительно тупого borrow checker работать в Rust с разными мутабельными кусками одной структуры неудобно, даже если они заведомо не пересекаются. Для наиболее простых случаев годится
В случае, если у структуры данных есть некоторая разновидность индексации, которая сопоставляет разным индексам разные элементы, то можно раздавать мутабельные ссылки на разные элементы, соответствующие разным наборам непересекающихся индексов. На практике это выливается в некоторый бойлерплейт с unsafe, который ещё и надо написать достаточно аккуратно, чтобы не потерять проверки времён жизни.
Библиотека paradis как раз стремится заполнить этот пробел за счёт предоставления этих наборов уникальных непересекающихся индексов и их комбинаторов, сохраняющих эти свойства, а также, разумеется, геттеров, использующих эти наборы индексов. Для каждой отдельной структуры данных требуется только реализовать геттер по индексу (unsafe, разумеется). Причём так как эти абстракции предназначены для использования в многопотоке, геттер возвращает данные, принимая self по разделяемой ссылке.
Автор отдельно отмечает, что paradis — экспериментальная библиотека и её дизайн ещё может поменяться.
Enter paradis — A new chapter in Rust's parallelism story
Из-за правил относительно тупого borrow checker работать в Rust с разными мутабельными кусками одной структуры неудобно, даже если они заведомо не пересекаются. Для наиболее простых случаев годится
spli_at_mut
на слайсах, но это не распространяется на более сложные структуры данных и на более сложные случаи. Скажем, просто разбить слайс на набор мутабельных ссылок на элементы с чётными и нечётными индексами уже не получается.В случае, если у структуры данных есть некоторая разновидность индексации, которая сопоставляет разным индексам разные элементы, то можно раздавать мутабельные ссылки на разные элементы, соответствующие разным наборам непересекающихся индексов. На практике это выливается в некоторый бойлерплейт с unsafe, который ещё и надо написать достаточно аккуратно, чтобы не потерять проверки времён жизни.
Библиотека paradis как раз стремится заполнить этот пробел за счёт предоставления этих наборов уникальных непересекающихся индексов и их комбинаторов, сохраняющих эти свойства, а также, разумеется, геттеров, использующих эти наборы индексов. Для каждой отдельной структуры данных требуется только реализовать геттер по индексу (unsafe, разумеется). Причём так как эти абстракции предназначены для использования в многопотоке, геттер возвращает данные, принимая self по разделяемой ссылке.
Автор отдельно отмечает, что paradis — экспериментальная библиотека и её дизайн ещё может поменяться.
👍10❤5
Блог*
#meme про женскую одежду. Насколько я знаю из разговоров со знакомыми женщинами — правдивый.
Ну и раз уж речь зашла об одежде...
#meme о том, как перестать быть слабаком и одеваться по-мужски (прямо как в старые добрые)
#meme о том, как перестать быть слабаком и одеваться по-мужски (прямо как в старые добрые)
🥰16💩3👌3🤮1🤡1
Forwarded from The After Times
Доступ к платным статьям на Medium.
Вдруг пригодятся, как пригодились мне.
Ниже два сервиса для обхода ограничений:
https://freedium.cfd/<URL>
https://medium-forall.vercel.app/
Вдруг пригодятся, как пригодились мне.
Ниже два сервиса для обхода ограничений:
https://freedium.cfd/<URL>
https://medium-forall.vercel.app/
🔥22👍3🤔1🙏1
#prog #rust #rustlib
Стандартная библиотека Rust предоставляет типы Path и PathBuf, которые инкапсулируют в себе платформо-специфичные пути в файловой системе. Эти пути не обязательно закодированы в UTF-8, поэтому работать с
Подход std правилен в том смысле, что не делает каких-то предположений о содержимом файловых путей, но на практике подавляющее большинство путей и так в UTF-8, а некоторые программы вообще с не-UTF-8 путями не работают, поэтому такая педантичность мешается.
Библиотека camino позволяет сделать работу с путями более эргономичной. Именно, она предоставляет типы Utf8Path и Utf8PathBuf, которые повторяют функциональность
Если что, camino используется в rust-analyzer.
И ещё: если вам требуется отобразить путь при помощи
Стандартная библиотека Rust предоставляет типы Path и PathBuf, которые инкапсулируют в себе платформо-специфичные пути в файловой системе. Эти пути не обязательно закодированы в UTF-8, поэтому работать с
Path
не очень удобно: Path
не реализует Display
, множество полезных функций для манипуляции строками доступны только на str
, но конвертация из Path
в str
может вернуть ошибку.Подход std правилен в том смысле, что не делает каких-то предположений о содержимом файловых путей, но на практике подавляющее большинство путей и так в UTF-8, а некоторые программы вообще с не-UTF-8 путями не работают, поэтому такая педантичность мешается.
Библиотека camino позволяет сделать работу с путями более эргономичной. Именно, она предоставляет типы Utf8Path и Utf8PathBuf, которые повторяют функциональность
Path
и PathBuf
, но гарантированно в UTF-8. Эта проверка осуществляется только один раз: во время создания этих типов, поэтому преобразование из них в str
всегда успешно, и вдобавок они реализуют Display
.Если что, camino используется в rust-analyzer.
И ещё: если вам требуется отобразить путь при помощи
Display
, то вам пригодится метод display на Path
. Он возвращает тип, который по возможности отображает путь так же, как и str
, и каким-то образом замещает невалидные UTF-8 последовательности.👍15🤡5🔥1💩1
Блог*
#prog #rust #rustreleasenotes Вышла версия Rust 1.79.0! Как обычно, тут только избранные моменты, остальное в полных заметках. ▪️Стабилизированы inline const блоки! Одно из самых непосредственно полезных применений — array repeat expression. Если раньше…
Тут один человек показал, для чего ещё может пригодиться inline const
Telegram
Random Rust Dev
Возможно многие как и я ждут эту фичу.
Она должны быть в следующием релизе на stable.
Она позволяет исправить следующий код что бы тот компилился.
fn get_iter<'a, T>(q: Option<&'a VecDeque<T>>) -> std::collections::vec_deque::Iter<'a, T> {
q.unwrap_o…
Она должны быть в следующием релизе на stable.
Она позволяет исправить следующий код что бы тот компилился.
fn get_iter<'a, T>(q: Option<&'a VecDeque<T>>) -> std::collections::vec_deque::Iter<'a, T> {
q.unwrap_o…
👍2