Linker Unsafe
220 subscribers
182 photos
24 videos
18 files
859 links
Собираю ржавые и лямбдообразные новости, прикольные цитатки с форумов, ссылки на статьи и всё такое. В-общем, сюда я тащу такие крупицы, которые мне будет жаль потерять в цифровой бездне. Возможно, они покажутся интересными и вам.

Фи сюда: @nlinker
Download Telegram
Открываю релиз ноты 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), который (Герб) представляя свою библиотеку, реализующую Copy-On-Write в плюсах изрёк две противоречивые мысли:

» 1. Библиотека сделана на случай возможного использования из нескольких потоков. Это означает, что деградация производительности будет иметь место даже если программа будет выполняться строго в одном потоке.

» 2. Примеры будут на C++, но рассуждения применимы к любому языку.

И тут оказывается, что-таки растовый Cow<T> избегает деградации производительности и накладных расходов, связанных с многопоточностью, если используется в одном потоке!

Так уж получается, что гуру, повидав C++ и изучив его досконально, намылил глаз и свой опыт нечаянно распространил на любые языки. Бывает 😃
Хороший крейт, если мне однажды надо сделать будет динамический диспатч, но нужно будет избежать лишнего косвенного вызова для быстродействия, этот крейт поможет.
https://crates.io/crates/enum_dispatch

Встречал как-то в обсуждениях, но самому использовать не доводилось. Чтобы не забыть, пусть повисит здесь.
"Первый, первый, у нас пробой в области жопы"😂
Источник уже не найду, где-то на хабре. Но удовольствие от прочтения как в первый раз🤤
С днём математика, этот день можно легко превратить в праздник, просто решив что-нибудь забористое. )
Капец, только что майнтейнер 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".🤪

Я так и не понял, куда надо стремиться, чтобы выполнить требования. Он не похож на бывшего джависта, у которого "память больше не ресурс", и не плюсовик, у которого "ты здесь сделал лишнее ветвление, ты заставляешь процессор сбрасывать конвейер😡", и не питонист, которому "похер, лишь бы работало".

Короче, я рад, но одновременно в растерянности.
Единственное, что мне понравилось, это его предложение заменить
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 никогда раньше не использовал и он офигенен.
Мейнтейнер indicatiff какой-то эстет, вероятно бывший хаскеллист 😂
Ехал (void*) через (void*)
Видит (void*) - в (void*) (void*)
сунул (void*) (void*) в (void*)
(void*)(void*)(void*)(void*)
Комментарий хорош👆
Forwarded from ozkriff.games 🦀 (Andrey @ozkriff Lesnikóv)
# Rust GameDev Newsletter 20: Март 2021

📆 Выпустил ежемесячник по ржавому игрострою за Март: https://rust-gamedev.github.io/posts/newsletter-020 (обсуждения: /r/rust, Twitter).

По Земероту и новому проекту в ближайшие месяцы обновлений можно не ждать: я вконец загнался и решил таки взять "отпуск от хобби" как минимум до лета (а то и до осени).
Преобразование сишной строки в &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())
}
Разгрызите ещё этих не очень сладких, но вкусных калачей, выпейте чаю, да взгляните на космос. Постарайтесь аккуратно облететь во-он те спутники. Подключайте нейроинтерфейс и запускайте среду программирования Rusty JetSuperbrains, пора заняться делом 😎😉 🚀🚀🚀
Большая статья про интероп с C++ и кишки.
Я ещё не читал, оставлю здесь с тегом #статья
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