Открываю релиз ноты Rust, вижу не очень красивый коде сниппет
Увы, нужно признать, разработчики языка допустили архитектурную ошибку💥, теперь это соглашение ушло в библиотеки и сторонний код. Бывает.
Теперь будем терпеть, если вдруг в каком-то месте нужно будет переключиться с вектора на массив (или обратно), нужно будет протыкать и форычи заодно.
fn main() {И дальше: "Обратите внимание, что это было добавлено как отдельный метод, вместо
let array = [1, 2, 3, 4, 5];
// Было
for item in array.iter().copied() {
println!("{}", item);
}
// Стало
for item in std::array::IntoIter::new(array) {
println!("{}", item);
}
}
.into_iter()
, так как сейчас оно ломает текущее соглашение о том, что .into_iter()
относится к срезам по ссылочному итератору."Увы, нужно признать, разработчики языка допустили архитектурную ошибку💥, теперь это соглашение ушло в библиотеки и сторонний код. Бывает.
Теперь будем терпеть, если вдруг в каком-то месте нужно будет переключиться с вектора на массив (или обратно), нужно будет протыкать и форычи заодно.
Статья, написанная ещё год назад, у меня дошли руки только сегодня.
https://oribenshir.github.io/afternoon_rusting/blog/copy-on-write
В этой статье автор ссылается на Герба Саттера (Herb Sutter), который (Герб) представляя свою библиотеку, реализующую
» 1. Библиотека сделана на случай возможного использования из нескольких потоков. Это означает, что деградация производительности будет иметь место даже если программа будет выполняться строго в одном потоке.
» 2. Примеры будут на C++, но рассуждения применимы к любому языку.
И тут оказывается, что-таки растовый
Так уж получается, что гуру, повидав C++ и изучив его досконально, намылил глаз и свой опыт нечаянно распространил на любые языки. Бывает 😃
https://oribenshir.github.io/afternoon_rusting/blog/copy-on-write
В этой статье автор ссылается на Герба Саттера (Herb Sutter), который (Герб) представляя свою библиотеку, реализующую
Copy-On-Write
в плюсах изрёк две противоречивые мысли:» 1. Библиотека сделана на случай возможного использования из нескольких потоков. Это означает, что деградация производительности будет иметь место даже если программа будет выполняться строго в одном потоке.
» 2. Примеры будут на C++, но рассуждения применимы к любому языку.
И тут оказывается, что-таки растовый
Cow<T>
избегает деградации производительности и накладных расходов, связанных с многопоточностью, если используется в одном потоке!Так уж получается, что гуру, повидав C++ и изучив его досконально, намылил глаз и свой опыт нечаянно распространил на любые языки. Бывает 😃
oribenshir.github.io
Optimizations That Aren't, Or Are They?
This blog is designed to cover topics related to both Rust & C++ languages. This blog has emphasis on strong typing and design choices.
Хороший крейт, если мне однажды надо сделать будет динамический диспатч, но нужно будет избежать лишнего косвенного вызова для быстродействия, этот крейт поможет.
https://crates.io/crates/enum_dispatch
Встречал как-то в обсуждениях, но самому использовать не доводилось. Чтобы не забыть, пусть повисит здесь.
https://crates.io/crates/enum_dispatch
Встречал как-то в обсуждениях, но самому использовать не доводилось. Чтобы не забыть, пусть повисит здесь.
Капец, только что майнтейнер
Нынешний PR, который я сделал 23 дня назад: https://github.com/mitsuhiko/indicatif/pull/258
Прошлый PR, аж с 13 Июля 2020 (!): https://github.com/mitsuhiko/indicatif/pull/185
Некоторые из комментариев меня почти выбивали из колеи, например, сначала товарищ говорит, мол
Потом "давай использовать BinaryHeap", а позже "ой, ну наверное BTreeSet лучше", а потом "да и пофиг, пусть будет Vec".🤪
Я так и не понял, куда надо стремиться, чтобы выполнить требования. Он не похож на бывшего джависта, у которого "память больше не ресурс", и не плюсовик, у которого "ты здесь сделал лишнее ветвление, ты заставляешь процессор сбрасывать конвейер😡", и не питонист, которому "похер, лишь бы работало".
Короче, я рад, но одновременно в растерянности.
indicatiff
замерджил мой PR, после разборок на 39 комментов и предыдущего PR, который за полгода устарел настолько, что его было проще переписать заново, чем ребейзить на новый мастер (простите, main🤮).Нынешний PR, который я сделал 23 дня назад: https://github.com/mitsuhiko/indicatif/pull/258
Прошлый PR, аж с 13 Июля 2020 (!): https://github.com/mitsuhiko/indicatif/pull/185
Некоторые из комментариев меня почти выбивали из колеи, например, сначала товарищ говорит, мол
HashSet
тормозит и жрёт память, а потом говорит, мол, зря я в следующих правках занимаюсь оптимизацией, ведь у нас ограниченное количество элементов.Потом "давай использовать BinaryHeap", а позже "ой, ну наверное BTreeSet лучше", а потом "да и пофиг, пусть будет Vec".🤪
Я так и не понял, куда надо стремиться, чтобы выполнить требования. Он не похож на бывшего джависта, у которого "память больше не ресурс", и не плюсовик, у которого "ты здесь сделал лишнее ветвление, ты заставляешь процессор сбрасывать конвейер😡", и не питонист, которому "похер, лишь бы работало".
Короче, я рад, но одновременно в растерянности.
GitHub
Implement `remove` method for `MultiProgress` by nlinker · Pull Request #258 · mitsuhiko/indicatif
Fixes #184
Redone #185 against other branch and rebased on the fresh main
Redone #185 against other branch and rebased on the fresh main
Единственное, что мне понравилось, это его предложение заменить
на
Блин,
if state.objects[*idx].is_some() {
state.objects[*idx] = None;
state.free_set.insert(*idx);
if let Some(idx) = state.ordering.iter().position(|x| *x == *idx) {
state.ordering.remove(idx);
}
...
}
на
if let Some(obj) = state.objects[*idx].take() {
state.free_set.insert(*idx);
state.ordering.retain(|&x| x != *idx);
...
}
Блин,
Option::take
никогда раньше не использовал и он офигенен.Forwarded from Misha 🦗 𓆧 Cat Synth 🌿😻
Ехал (void*) через (void*)
Видит (void*) - в (void*) (void*)
сунул (void*) (void*) в (void*)
(void*)(void*)(void*)(void*)
Видит (void*) - в (void*) (void*)
сунул (void*) (void*) в (void*)
(void*)(void*)(void*)(void*)
Я теперь, можно так выразиться, контрибьютор в open source!😎
https://github.com/mitsuhiko/indicatif/pull/268
https://github.com/mitsuhiko/indicatif/pull/268
GitHub
Update multi-tree example by nlinker · Pull Request #268 · mitsuhiko/indicatif
Modified multi-tree example to demonstrate MultiProgress modifications. Demo:
Forwarded from ozkriff.games 🦀 (Andrey @ozkriff Lesnikóv)
# Rust GameDev Newsletter 20: Март 2021
📆 Выпустил ежемесячник по ржавому игрострою за Март: https://rust-gamedev.github.io/posts/newsletter-020 (обсуждения: /r/rust, Twitter).
По Земероту и новому проекту в ближайшие месяцы обновлений можно не ждать: я вконец загнался и решил таки взять "отпуск от хобби" как минимум до лета (а то и до осени).
📆 Выпустил ежемесячник по ржавому игрострою за Март: https://rust-gamedev.github.io/posts/newsletter-020 (обсуждения: /r/rust, Twitter).
По Земероту и новому проекту в ближайшие месяцы обновлений можно не ждать: я вконец загнался и решил таки взять "отпуск от хобби" как минимум до лета (а то и до осени).
Rust GameDev WG
This Month in Rust GameDev #20 - March 2021
Welcome to the 20th issue of the Rust GameDev Workgroup's
monthly newsletter.
Rust is a systems lang…
monthly newsletter.
Rust is a systems lang…
Преобразование сишной строки в
Но нужно соблюсти 2 условия:
- сишная библиотека обязана не удалять строку
- сишная библиотека обязана не менять строку
Если соблюдение этих условий кажется проблематичным, то лучше сделать owned copy:
&str
можно сделать так:pub fn safe_fun() -> Result<&'static str, Utf8Error> {
let char_ptr = unsafe { unsafe_fun() };
let c_str = unsafe { CStr::from_ptr(char_ptr) };
c_str.to_str()
}
Но нужно соблюсти 2 условия:
- сишная библиотека обязана не удалять строку
- сишная библиотека обязана не менять строку
Если соблюдение этих условий кажется проблематичным, то лучше сделать owned copy:
pub fn safe_fun() -> Result<String, Utf8Error> {
let char_ptr = unsafe { unsafe_fun() };
let c_str = unsafe { CStr::from_ptr(char_ptr) };
c_str.to_str().map(|s| s.to_owned())
}
Большая статья про интероп с C++ и кишки.
Я ещё не читал, оставлю здесь с тегом #статья
https://hsivonen.fi/modern-cpp-in-rust/
Я ещё не читал, оставлю здесь с тегом #статья
https://hsivonen.fi/modern-cpp-in-rust/
Классная идея, особенно для FFI. Типа "превратим Rust в ООП с виртуальными таблицами и вот этим всем вот". Многие подумают, мол ну что за бред, зачем возвращать то, от чего ушли (наконец-то)?
Ну вот, для FFI, когда надо передать объект в C++, он в том рантайме будет туда-сюда передаваться, а когда вернётся обратно в Rust — все методы будут на месте и их можно будет корректно вызвать. Так что вот статья.
https://adventures.michaelfbryan.com/posts/ffi-safe-polymorphism-in-rust/
А вот человек засучил рукава и обернул это в удобный макрос:
https://github.com/kotauskas/thin_trait_object
Ну вот, для FFI, когда надо передать объект в C++, он в том рантайме будет туда-сюда передаваться, а когда вернётся обратно в Rust — все методы будут на месте и их можно будет корректно вызвать. Так что вот статья.
https://adventures.michaelfbryan.com/posts/ffi-safe-polymorphism-in-rust/
А вот человек засучил рукава и обернул это в удобный макрос:
https://github.com/kotauskas/thin_trait_object
Michael-F-Bryan
FFI-Safe Polymorphism: Thin Trait Objects
A while ago someone posted a question on the Rust User Forums asking how to achieve polymorphism in a C API and while lots of good suggestions were made, I’d like to explore my take on things.
As a recap, Rust provides two mechanisms for letting you write…
As a recap, Rust provides two mechanisms for letting you write…