Rust — невероятно быстрый язык для системного программирования без segfault'ов и с гарантиями потокобезопасности.ИТТ мы можем объяснить базовые и продвинутые концепции языка, ипрограммирования в целом, поможем вкатывающимся, подскажем чтовыбрать для веба, игр или спасибо абу блокчейна.https://www.rust-lang.org> Пачиму helloworld весит как моя мамка?!1йhttps://lifthrasiir.github.io/rustlog/why-is-a-rust-executable-large.htmlЧитатьОф. книга, она же растбукhttps://doc.rust-lang.org/book/https://rustbyexample.com/Очень хорошая книга, отлично зайдет после растбука:http://shop.oreilly.com/product/0636920040385.doУпражненияhttps://exercism.io/tracks/rusthttps://github.com/crazymykl/rust-koansПисатьIDEhttps://areweideyet.com/Вебняhttp://www.arewewebyet.org/Игрыhttp://arewegameyet.com/Etchttps://wiki.mozilla.org/AreweyetСписок интересных проектовhttps://github.com/rust-unofficial/awesome-rustНовостиКомпиляция всего, что произошло за неделюИногда постят вакансииhttps://this-week-in-rust.org/Сколько вешать в лайкахhttps://github.com/trending/rustОп рекомендует:https://www.amethyst.rs/https://github.com/TatriX/dvach
>Programming Rust почитай или просто задавай конкретные вопросы или приводи примеры кода.Двачую за Programming Rust. Rust book говно какое-то: воды много, по делу мало, некоторой инфы вообще нет.
>>1369507В отличии от тебя, растопидоры знают более одного языка и скорее всего в них входят C и C++. Ты же не знаешь ни одного, студент мамкин.
Так что растопидоры, как люди с широким кругозором, могут срать в разных тредах, а ты - только в своем загоне
>>1369533>Memory is usually managed with garbage collection, but specific objects may be finalized immediately when they go out of scope>Functions marked @safe are checked at compile time to ensure that they do not use any features that could result in corruption of memory, such as pointer arithmetic and unchecked casts, and any other functions called must also be marked as @safe or @trusted. Functions can be marked @trusted for the cases where the compiler cannot distinguish between safe use of a feature that is disabled in SafeD and a potential case of memory corruption.этакая джява из мира с++?
>>1369689Всё просто: у Торвальдса лучше всего стоял, когда си были также прогрессивны, как сейчас раст. Что может быть прекраснее поиска потенциального нулевого указателя в очередном коммите? Только внезапно обнаружить гонку при работе с памятью, через которую знающие люди имеют ядро во все щели уже лет 10 Dirty COW , агаТакое-то ностальжи, такой-то адреналин, возможны только с сями.
>>1369829>Хотя бы потому что в отличии от Ди на расте есть блокчейнопараши, которые закроются, когда доедят деньги инвесторовftfy
>>1369847Всегда можно будет уйти работать в Мозиллу но только если ты трансгендер-мусульманин, разумеется!
После прочтения главы про ссылки и владение в "programming rust" у меня потекли слезы от божественности дизайна языка. Ave Rust!
>>1371586Первое напишет, но не переведет строку, второе не скомпилится, третье перевдет каретку на новую строку после написания.
https://m.habr.com/ru/post/445670/>Разработка Quantum CSS началась, чтобы повысить производительность. Улучшение безопасности — просто удачный побочный эффект.>вся статья про количество багов и сколько этих багов самим существованием кода на Rust было закрыто. ну и какие-то васянские замеры в каментах.так есть все-таки более или менее близкий к правде бенчмарк на какие-то параллелируемые алгоритмы на системных языках?
>>1371569НИНУЖЕН РАСТ!!!! НИНУЖЕН Я СКАЗАЛ!!!! НУ ЧТО ЖЕ ВЫ НИ ПАНИМАЕТЕ ТО, ЧТО НИНУЖЕН!!!!!https://blog.cloudflare.com/boringtun-userspace-wireguard-rust/
>>1371835Что cloudflare, что dropbox основной код пишут на go, а на rust всякие latency-critical вещи или байтоебские.
>>1371913Rust - также классный язык общего назначения, так что было бы круто, если бы всё на нем писали. >>1371865Плюсоговно вообще не рассматриваю, желаю ему, чтобы оно поскорее сдохло.Я только вкатываюсь в раст и вот только навскидку:- В плюсах есть 5 конструкторов + 3 оператора присваивания. Некоторые из них имеют неявное преобразование аргументов, некоторые - нет. Все это говно надо держать в голове. Что есть в расте? А нихуя нет, просто вообще нет конструкторов. Можно сделать статический метод new, если хочешь. А можно и не делать.- В плюсах есть 5 видов ссылок, lvalue, rvalue, xvalue и еще два, забыл их. Столько типов ссылок надо для разруливания тупорылого легасного приведения между разными ссылками в разных ситуациях. Подробнее здесь - https://en.cppreference.com/w/cpp/language/value_category . (Алсо после появления мув-семантики появилось 100500 статей, чтобы охуевшие бедолаги таки поняли это говно, что как бы намекает на качество дизайна языка). В расте же ссылка либо mutable, либо шаренная, либо владеющая.Просто выкидываем говно и получаем простую конфетку, которую легко изучать.
>>1371924ну ебатьраст писался на плюсовом, в том числе, опыте нескольких десятков лет разработки тонн говна и адской боли от получившихся результатов. это как джяву упрекать в том, что она не дотнет
>>1371926Я никого не упрекаю, просто агитирую за все хорошее против всего неудобного. С++ - легаси, Rust - не легаси, вот пару моментов "почему это так"
>>1371928В C++ нормальные гибкие duck typed темплейты, Rust - безальтернативная тайпклассопараша.Поэтому, к сожалению, Rust хуйня.
>>137193410 лет пытаются внедрить концепты(которые по сути тайпклассы), потому что от SFINAE и сообщений компилятора тянет блевать даже фанатов александреску. А rust с тайпклассами из коробки - это хуйня, да
>>1371938>концепты(которые по сути тайпклассы)Это не так.У тайпклассов есть свои преимущества, но перед ООП с виртуальными методами и т. п. Но вот против мощи темплейтов в расте ничего нет.
>>1371924>было бы круто, если бы всё на нем писали. Дорага же.>>1371934Я, кажется, первый раз вижу человека, который утверждает "кресты крута тому ша темплейты". Ты же троллишь, да?Меня затроллил.
>>1371597>так есть все-таки более или менее близкий к правде бенчмарк на какие-то параллелируемые алгоритмы на системных языках?А что ты ожидаешь увидеть? Везде те же самые потоки на одних и тех же ОС и с теми же самыми мьютексами. В расте придется Arc поклонировать 16 раз, чтобы компилятор не ругался (но в зависимости от подхода то же самое нужно будет сделать и на плюсах). Смотри однопоточные тесты, дели на N, увидишь +\- точные цифры.
>>1371890Да, я. Есть что по делу сказать?>>1371864> Что cloudflare, что dropbox основной код пишут на goПока пишут. Вон один проект уже решили начать писать на расте, дальше - больше.> latency-critical вещи или байтоебскиеА у них (конкретно дропбокс и клауд) есть НЕ "latency-critical вещи или байтоебские" вещи (кроме фронтенда, офк)? Кстати, этот впн таки не просто так, а для публичного сервиса: https://blog.cloudflare.com/1111-warp-better-vpn/
>>1371597Да, поганая статья (всмысле того, как построена). Мне кажется, что мамзель не очень понимает как писать, или она не очень в теме что и зачем переписывалось на расте. Меня зацепила эта фраза: "By 2017, Mozilla had made two previous attempts to parallelize the style system using C++. Both had failed". Выглядит так, что стали переписывать потому что параллелить хуиту такого размера и сложности, как браузерный движок, было КРАЙНЕ сложно на крестах, и решили в итоге взять более строгий язык, не уступающий в скорости, "системный". Просто по поводу чистой скорости на один поток >>1372691 правильно написал. Тут может быть выигрыш только за счет строгости самого языка и вытекающих отсюда оптимизаций.
>>1371943>Но вот против мощи темплейтов в расте ничего нет.А что есть у C++ против мощи макросов раста?Почему на С++ с его мощными темплейтами невозможны такие вещи, как serde или pest?
Сап. Скалан вкатывающий в раст всё ещё не слился, если кто волнуется.Дочитал растбук до енумов. Всё круто. Проблем с концепцией владения вроде не возникло. Довольно простые правила, довольно логичные. Наверное просто мой мозг не засран концепциями C и C++. Хотя возможно это только верхушка айсберга.Начинает напрягать вербозность растбука. Думаю перекатиться на rust by example. Стоит ли?
>>1381059> Довольно простые правила, довольно логичные.Ну, после NLL основная претензия к борроу чекеру это неудобства при работе со структурами. Вот тут поясняется подробней: http://smallcultfollowing.com/babysteps/blog/2018/11/01/after-nll-interprocedural-conflicts/
>>1381059Что первое, что второе дрисня та еще. Читай лучше Programming Rust. Написали чуваки из language team
>>1381059Зачем тебе вообще сдался раст? Не лучше ли улучшить свои навыки для шкалапидора?Где тебе пригодится раст? Задумайся.
>>1381597Я думаю, раст я буду использовать в вебе.Потому что быстро и избавляет (насильно) от ошибок программиста. Плюс конкурренси, удобный тестинг, пара гендеров в кармане и тд.
>>1380457К сожалению у меня нет контента по Расту.Да и писать сейчас приходиться не на нём.Но ты всё равно не умирай.
nth prime rust idiomatic - https://godbolt.org/z/fcTsYZnth prime c++ - https://gcc.godbolt.org/z/5o11_8nth prime c++ constexpr - https://gcc.godbolt.org/z/0jWK7pГодно, базара ноль.НО КАК ЖЕ ХОЧЕТСЯ ТЯНОЧКУ НОРМАЛЬНЫЙ CONST FN
>>1369496 (OP)А как в Rust с GUI дела обстоят? Я знаю про https://areweguiyet.com/ мне интересны ваши личные впечатления
>>1382014> tui-rs is a Rust library to build rich terminal user interfaces and dashboards. Это, конечно, не гуй, но выглядит интересно. А какие юзкейсы? Что-то я не припомню, что-бы в последнее время у кого-то были дашборды в терминале.мимо другой анон
>>1382032Ты просто виндузятник наверное. А консолечка очень популярна среди 1% от 1% всех линуксоидов.
>>1382033Я прыщеблядь. Люблю пердолиться с консолькой, но ни разу не видел дашбордов в терминале. Или это что-то для петпроджектов?
>>1381602Эх, хорошо бы что-то новое в вебе, но ТЕБЕ. ВСЕ. РАВНО. НУЖЕН. ДЖЭЭС. СУКА. Один хуй нужны биндинги к DOMу и всей хуйне, предоставляемой браузером. Хотя можно попытаться сделать фронт на yew, да.
>>1382238Подожди, я тебе говорю просто факт: чтобы из WASM работать с DOMом, вообще с внешним миром, тебе нужны биндинги на JS. Да, часть кода сгенерируется (в том же yew тебе вряд ли понадобится JS для hello world), но JS все равно остается. Если хочешь опровергнуть, то покажи как без JS загрузить WASM модуль, как модифицировать DOM.А свое > Открой для себя мир kitlinjs, scalajs, tvoyamamkajs можешь себе в задницу засунуть. А потом узнать, что это хуита, просто компилирующаяся в JS, а не WASM. И да, там тоже есть JS, внезапно, не так ли?
>>1382244>компилирующаяся в JSА что в этом плохого? Конпелируемые языки конпеляются, грубо говоря, в ASM, писать на котором та ещё мука.
>>1382284Ничего особо плохого, наверно (кроме того что джс медленное говно, но оставим это в стороне). Но сравнивать Rust, который компилируется в WASM и Scala, которая в JS, немного некорректно. На что я и указал.Да, есть Emscripten, который компилит в JS, но это все же немного другое опять же. Костыль для тех бразуеров, где нет поддержки WASM, и приходится LLVM в JS компилить, а не в WASM.
>>1381597Мои навыки шкалапидора улучшаются параллельно.Раст просто интересен, работу искать на нём не планирую.
>>1382143Ты тупой да? На беке можно использовать что угодно, хоть асм. Ты такую сейчас неревантную хуйню сморозил.
>>1382658Угу, так и есть. Я допускаю, что изначально все таки речь не шла о фронта, но вот фраза > Я думаю, раст я буду использовать в вебе.сделала меня думать про фронт и последующие несколько сообщений были ЯВНО про фронт. Вообще, не смотря на то, что я не люблю JS по множеству причин, сложно отрицать что ему сейчас замен нет. Поэтому раст видится как только язык для всяких числодробительных модулей типа криптографии.
>>1369692ЛОЛ, да у него же синдром утенка + Когда всю жизнь пишешь на одном языке, ясен хуй он для тебя как родной
>>1376722лексические макросы например,#define, #ifdef, #endif, #undef,#pragma,потом че еще, ну там крутой современный подход к созданию модульных приложенией:#include "linux.h" // вот так типооно там копирует и линкует потом, вообще топчикМожно функции свои делать типо#define sum(x, y) ((x) + (y))там еще можно имя переменной подставлять типо #y или как то так
>>1383148Он где-то говорил про Раст что-то в духе "говно, конечно, но гораздо лучше, чем то, что пытались делать раньше". Там что, можно считать, что ему понравилось.
Написал структуру, запилил ей fmt::Display. Display, как я понял, покрывает to_string(). Чому тогда String::from(YobaStruct("yoba")) говорит, что std::convert::From не определен для String? Почему он не использует Display, в чем принципиальная разница?Ну и шо, в расте можно для std трейты самому пилить?
>>1384784че-то я в списке методов String::from не вижу <T: Display>. схуяли ты решил, что оно должно заработать?
>>1384863Да хуй знает. Чем тогда отличается реализация to_string от Display и от String::from, нахуй столько вариаций?
>>1384887String::from - это конвертерDisplay - это для форматированного представления в условную консольку или поток ошибокэто не совсем одно и то же, хотя под капотом однохуйственно превращается из T в String. это как шаблоны адаптер и декторатор смешивать. потому, что под капотом запускают целевой метод интерфейса
>>1384895Ок, допустим, результат String::from и форматирования YobaStruct может отличаться. А to_string? Вот я пишу структуру, почему нужно для преобразования её в строку отдать предпочтение String::from, а не to_string?
>>1384959Да я сам нубас, поэтому спрашиваю как тут ПРИНЯТО. Ну вот если я запилю и to_string, и String::from, которые будут работать одинаково, нахрена их две штуки тогда? Но зачем-то же сделали возможность преобразовать структуру в строку двумя путями, я вот и спрашиваю, зачем. Ну и, собственно, не понятно тогда от остальных типов чего ожидать для этого: to_string или String::from. Выходит, либо для каких-то случаев один из них предпочтительнее, либо просто две нахуй не нужных одинаковых сущности зачем-то запилили.Алсо, лапша вроде xyu.iter().enumerate().map().govno().mocha().nebo().allah().flatten().collect() приемлема в коде или лучше разбивать на куски?
>>1384961>лапшаА в чем тут лапша, можешь объяснить?>разбивать на куски?А как именно ты бы это разбил на куски? xyu_iterated = xyu.iter(); xyu_enumerated = xyu_iterated.enumerate(), лол?
fn main() { useless();}fn useless() { let vector = vec!(3, 2, 1, 1 / 0);}почему канпелятор не настолько умный шобы выпилить аллокацию вектора? в расте нет многообещанной плюсами "плати за то, что используешь"? (я хз, работает ли оно там или нет)и второе, для того, чтобы использовать условный lazy для элементов, мне обязательно пердолиться функторами/замыканиями? чтобы, например, сделать такое:vec!(3, 2, 1, 1 / 0).len();
>>1384961Видать именно поэтому в rust'е все имена убого сокращены: "vec" "fn" "str" "mut" "iter" "into_iter" "sleep_ms"...А еще убогость в сочетании camel case и сишных hui_pizda
>>1377610Кстати, актуальный вопрос. Растоманы, к вам не лезут на Гитхабе с заявлениями, что нельзя называть пользователя "he", надо добавить больше CoCа и т.д.? У меня сложилось такое впечатление, что англоязычное сообщество Раста в этом плане одно из самых неадекватных.
>>1385213>почему канпелятор не настолько умный шобы выпилить аллокацию вектора?Тебе ж будет ворнинг о неиспользуемом значении, что еще надо-то?
Дайте, пожалуйста, длинный пиздатый туториал по piston, вроде вот этогоhttp://piston-tutorial.logdown.com/только работающий. Приведённый устарел настолько, что интерфейс библиотеки уже совсем другой, тамошний код не работает нихуя.
наверное, это было в прошлом тренделе, а именно обсуждение форматирование документа и худой-бедный intellisense в vs codeдокладываю, на линухе эта еболда завелась прям без бубнов. проде бы пакеты установлены те же, что и на шиндошсе
>>1387132лучи поноса пользователям электрона.спасибо хоть телега пишет свою морду на сях. Единственное пользовательское приложение из 2019 года которое не жрёт оперативку как не в себя
>>1387224И которое работает по-настоящему отзывчиво. Надеюсь в будущем gui будут писать на расте, который будет тем qt, который мы всегда хотели
А что под гРуст нет простого перекодировщика строк из cp1251 в utf-8 и обратно? Печально.// Турист с визитом из ГоЛанга
>>1387240> Надеюсь в будущем gui будут писать на расте, который бУгу, сейчас. Все обоссываются от счастья от WASM-а. Комитетов по продвижению насобирали больше чем было при Хрущеве, а толку ноль.Как была разработка и компиляция под WASM процессом, напоминающим секс на ходулях, так и осталась.
>>1387361>WASMЯ ващет не погромист, я клавиатуру на помойке нашёл,но у меня вопрос:разве васм это не результат компиляции?Если хочешь писать морду на васме - надо писать её на цивилизованном языке, вроде плюсов, и потом компилировать в васм.Но, блядь, для десктопной ебалы (типа скайпа или слака, которые блядь просто абузят электрон, сука, блядь, почему чат подвешивает машину в 2019, ёбанарот), проще её допилить до вменяемого состояния и скомпилировать сразу в асм, выкинув в мусорку весь движок хрома и плюнув ему в след.Разве я не прав?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6967f2d3119d4738b29d45b6434bde69когого хуя, спрашивается?вангую, что Lines::next()::to_lowercase() возвращает нечто, у которого contains() имеет чутка другую сигнатуру?
>>1388501https://stackoverflow.com/questions/50664501/stringcontainsstring-gives-the-trait-bound-string-fnmutchar-is-not-s
>>1388501ты вместо кложуры передал результат выполнения метода. Засунь метод, который после столбов || в фигурные скобки:| a, b | {magic(a, b)} - кложура| a, b | magic(a, b) - хуйня какая-то
>>1388792>говно без тулингаТы скажи, на каком языке пишешь и что ты хочешь от тулинга, а я тебя аргументированно обоссу
>>1388798Не корми, это какой-нибудь мамкин криптоброкер. Открыл для себя tensorflow и pandas и думает что выиграл в программировании.
>>1388805>не кормиСудя по активности треда, раст либо идеальный и ни у кого не возникает ни одного вопроса при его использовании, либо он никому не нужен и в следующем треде надо позаимствовать шапку у D треда.Так что я лучше осознанно покормлю
>>1388828>Судя по активности треда, раст либо идеальный и ни у кого не возникает ни одного вопроса при его использовании, либо он никому не нужен..., либо он никому не нужен на борде для девочек-анимешниц, и серьёзные разговоры про раст нужно искать тут:https://www.reddit.com/r/rusthttps://www.reddit.com/r/rust_gamedevhttps://stackoverflow.com/questions/tagged/rusthttps://www.rust-lang.org/communityНу то есть, реально, вариантов только три, и совершенное не ясно, какой из них имеет место быть в действительности.
Несложно показать, что задача статического управления памятью, как и статическая гарантия потокобезопасности в тьюринг-полных языках - неразрешимые задачи (сводятся к проблеме остановки). Именно поэтому в языках с полностью автоматическим управлением памятью используется динамическое управление - GC тупо чекает время от времени, какие объекты достижимы в данный момент времени.Растоёбы утверждают, что в Расте корректность управления памятью чекается статически. Это означает две с половиной вещи: 1. Должно быть какое-то ограничение, иначе статический чекер просто не будет работать.2. Должен быть способ обойти это ограничение, иначе некоторые корректные программы на Расте будет просто невозможно написать.2.5 Этот способ должен быть не тайным знанием, тонким слоем размазанным по кодобазе, а сосредоточен в каком-то одном месте с большой красной надписью "ВНИМАНИЕ В ЭТОМ МЕСТЕ ВЫ ОТКЛЮЧАЕТЕ ВСЮ АВТОМАТИЧЕСКУЮ БЕЗОПАСНОСТЬ И ПЕРЕХОДИТЕ НА ТЁМНУЮ СТОРОНУ ([x] - Да я понимаю что делаю и согласен что все дальнейшие сегфолты - моя личная вина)". Обращение к этому место должно происходить крайне редко, потому что язык должен быть спроектирован так, чтобы всё работало на автомате, но в растокомьюнити должно быть очень четкое понимание, когда именно этим следует пользоваться. Чтобы было понятнее, о чём я говорю, приведу пример для Агды. Агда гарантирует, что любая тайпчекнутая программа, написанная на ней, гарантированно завершается. Но это, очевидно, нельзя проверить для произвольной тьюринг-полной программы, а Агда - тьюринг-полный язык программирования. Поэтому в Агде есть специальная прагма TERMINATING, которая отключает termination checking в том месте, где это не может быть проверено автоматически, но программист гарантирует, что там всё в порядке. Как правило, это какие-то хорошо отлаженные библиотечные функции (не буду пиздеть, сам я не агдаёб, просто видел у них), т.е. в 99.999% в пользовательской программе эта прагма не используется, но агдаёбы очень хорошо понимают, где и зачем это надо применять. Прошу фанбоев не постить методички про ownership и livetimes (с тем же успехом я мог бы почитать высеры крестоблядков про их смартпоинтеры), а умных растоёбов указать, какие именно ограничения использует Rust и привести пример программы, когда растовский чекер не способен понять, что память можно освобождать и вынуждает писать программу, которая будет хавать память бесконечно, а также тот самый способ отключить проверку. Пример должен быть где-то внутри стандартной библиотеки Раста, что-то мне подсказывает.
>>1388851>Пример должен быть где-то внутри стандартной библиотеки Раста, что-то мне подсказывает.В смысле пример отключения чекера, а не пример, который хавает память бесконечно)) ну вы поняли.
>>1388851> иначе некоторые корректные программы на Расте будет просто невозможно написать.Там всё возможно написать. Обычно unsafe (а именно эта штука и отключает borrow checker вместе с некоторыми другими проверками) используют ради пирформанса. Например можно использовать умный указатель Rc (или Arc для многопоточных приложений) [1] с подсчётом ссылок плюc Cell (если внутри хранится значение, которое будешь полностью изменять внутри) или RefCell (если хранится ссылка или структура, которую полностью менять нет смысла) [2]. Но это всё будет медленней, чем работать со ссылкой напрямую, если ты точно знаешь время её жизни и можешь вручную её уничтожить. Пример: linked list, который можно сделать как через (A)Rc так и напрямую через unsafe (вот тут разжевывается подробно с кучей как safe, так и unsafe примеров: [3]).Проще говоря корректные программы всегда можно написать на расте, просто часть этих проверок будет пересена (но только если ты сам это захочешь, автоматически в расте ничего не делается) из компил-тайма в рантайм, что потенциально сделает программу медленней.> Этот способ должен быть не тайным знанием, тонким слоем размазанным по кодобазе, а сосредоточен в каком-то одном месте с большой красной надписью "ВНИМАНИЕ В ЭТОМ МЕСТЕ ВЫ ОТКЛЮЧАЕТЕ ВСЮ АВТОМАТИЧЕСКУЮ БЕЗОПАСНОСТЬ И ПЕРЕХОДИТЕ НА ТЁМНУЮ СТОРОНУЦелые книги по unsafe расту пишут (причём сами разработчики): [4].[1]: https://doc.rust-lang.org/std/rc/index.html[2]: https://doc.rust-lang.org/std/cell/index.html[3]: https://rust-unofficial.github.io/too-many-lists/index.html[4]: https://doc.rust-lang.org/nomicon/README.html
>>1388851Азы ансейфа описываются в каждом мануале по расту, для глубокого понимания есть куча книг.Если ты не в курсе про него значит ты даже вики-статью про Раст не осилил, и объяснять тебе что-то потеря времени.
>>1388875>Там всё возможно написать. Обычно unsafe (а именно эта штука и отключает borrow checker вместе с некоторыми другими проверками) используют ради пирформанса.Не-не-не. Должен быть пример не ради пирформанса, а именно пример, в котором чекер принципиально не способен работать. Т.е. пример, в котором чекер будет вынуждать тебя не освобождать память вплоть до завершения программы и потенциально хвавать память бесконечно, при том, что сама программа корректная и может уложиться в конечную память.Когда мы говорим о перформансе, мы утверждаем, что можем освобождать память пусть не оптимально, но существует некая аппроксимация, позволяющая гарантированно это сделать за конечное число шагов. Так вот, я утверждаю, что такой аппроксимации не существует. Ведь если бы она была, то проблема остановки была бы разрешима, пусть даже за хулион шагов, что не применимо на практике, но теоретически, она бы была решаемой. А цимес в том, что она даже теоретически неразрешима. Ну или я что-то не понимаю в управлении памятью, тогда опровергните мою гипотезу.>Целые книги по unsafe расту пишутСпасибо, прочитаю.
>>1388899> а именно пример, в котором чекер принципиально не способен работать.Я ж тебе говорю, в расте есть возможность переносить чекер в рантайм. Единственное место где подсчёт ссылок работать не будет - если структура ссылается на саму себя. Всё.
>>1388542ну так два метода с одинаковой сигнатурой замыкания. вопрос был про то, что в одном случае str => str работает, в другом выдает ошибку компиляции>>1388796.filter(|line| line.contains(query))это ведь канает>>1388543после решарперовского интеллисенса на русте совсем грустно гуглить документацию. посеба
>>1388899>Ну или я что-то не понимаю в управлении памятью, тогда опровергните мою гипотезу.Ради пирфоманса освобождать память не нужно вообще. Нужно выделять паять большими кусками аля 512метров, гиг, джва гига и уже поверх этих кусков писать свой кастомный аллокатор/переиспользовать объекты.
>>1388961Тогда уж лучше свой собственный сборщик мусора писать, иначе пирформанс может падать из-за постоянных аллокаций при создании объекта и деаллокаций при уничтожении, а специализированный GC может маленькие объекты создавать в специальном месте не выполняя аллокации вообще, а освобождать объекты в отдельном треде.
>>1388964Уничтожение объекта так же происходить не должно, вместо этого ссылка на него/индекс массива в котором он лежит отправляется в стек "свободных объектов", откуда фабрика его потом пытается взять и повторно инициализировать конструктороподобным паблик методом.
>>1389406Перед тем, как заходить в этот тред, надо включать мозг. Те, кто этого не делают, будут посланы нахуй быстрее, чем они успеют сказать "не понял".
>>1389535Полегче со словами, токсик. Иди проверь свои привилегии.Кстати, мозилла закрывает IRC-чятик для всех своих продуктов, потому что там было слишком много харрасмента и их слишком сложно модерировать: https://blog.rust-lang.org/2019/04/26/Mozilla-IRC-Sunset-and-the-Rust-Channel.htmlЭтот токсичный тред тоже не мешало бы закрыть (ну или хотя бы поставить несколько модераторов с phd по гендерным наукам). Язык программирования rust заслуживает большего.
>>1389582А вы точно при рождении были афро-русской? Может вы были белой, и просто покрасили лицо в афро-русский цвет? В таком случае это называется блекфейс и это очень привилегированно и плохо.
>>1389535> надо включать мозгЕсли под этим ты понимаешь "знать рандомного хуесоса, сделавшего очередную хуйню", то у меня для тебя плохие новости...
>>1388798Язык ради языка.Я вообще пишу под гейось и ведро. Последний год наблюдаю за рустом, одни поделки уровня б, прикрываемые под инновационными словами development.Максимум зачем он нужен, так это написать сортировочку пузырьком. Реальные решения уже давно реализованы и имеют 30к+ на гите.
>>1390180Даже лень придумывать язвительный комментарийhttps://github.com/cloudflare/boringtunhttps://github.com/BurntSushi/ripgrephttps://www.wired.com/2016/03/epic-story-dropboxs-exodus-amazon-cloud-empire/https://www.rust-lang.org/static/pdfs/Rust-npm-Whitepaper.pdfhttps://www.rust-lang.org/static/pdfs/Rust-Chucklefish-Whitepaper.pdfhttps://www.rust-lang.org/static/pdfs/Rust-Tilde-Whitepaper.pdfhttps://hacks.mozilla.org/2019/02/rewriting-a-browser-component-in-rust/https://www.reddit.com/r/rust/comments/bhtuah/production_deployment_of_rust_in_hft_system_at/+ еще куча блокчейн и финтех стартапов, внутренние проекты многих контор (https://prev.rust-lang.org/en-US/friends.html). Короче, подотрись и иди назад в свой яблочный загон.
>>1390180>одни поделки уровня б, прикрываемые под инновационными словами development.Редхат, мозилла и парити расплакались и уползли обратно под шконку, прихватив с собой свои поделки, ведь мобильный программист Олег, занимающийся поддержкой "Копателя", поставил их на место.
>>1390210>https://www.reddit.com/r/rust/comments/bhtuah/production_deployment_of_rust_in_hft_system_at/годно, спс
>>1388851>Но это, очевидно, нельзя проверить для произвольной тьюринг-полной программы, а Агда - тьюринг-полный язык программированияЧистый Раст без unsafe (включая код стандартной библиотеки) не является Тьюринг-полным языком. Если не использовать рекурсию, то он вообще регулярный, т.е. сводится к конечному автомату, а если использовать, то бесконтекстный. Следовательно, проблема останова для рекурсивно-перечислимых языков к нему не применима. Ебать, мне наконец-то пригодились знания из книги по формальным грамматикам, спасибо Абу.Из этого следует, что борроучекер не работает в случае, когда нам нужны возможности, выходящие за рамки контексто-свободных языков. Конкретно - когда нам нужно создавать объекты произвольного объёма и структуры. В таких случаях нужно создавать абстракции, которые позволяют свести работу с произвольными структурами к работе над конечным числом биндингов. Например, итератор по вектору - это структура, позволяющая коду работать с коллекциями неизвестного размера, но сама по себе состоит из в точности двух указателей, поэтому может спокойно анализироваться борроучекером.>и привести пример программы, когда растовский чекер не способен понять, что память можно освобождать Всё, что выделяется не на стеке, под ответственностью программиста или создателя либы. Если программист не определил деструктор, то будет утечка, если где-то скопировал указатель, но не сказал компилятору, то будет висячий указатель.
правильно ли я понимаю, возможности зафорсить погромиста создавать экземпляр моей структуры через ассоциированную функцию нет (иными словами, скрыть конструктор, сделать его приватным)?
>>1391150Ну ты можешь сделать поля своей структуры не публичными, тогда инстанс такой структуры не создать через фигурные скобочки, только через функцию.
>>1391150В рамках одного модуля такой возможности нет.В случае разных модулей, если у структуры есть непубличные поля, то инстанцировать её напрямую нельзя. Отсюда растут несколько соглашений:1) Если инстанс можно создать без параметров, то это делается через трейт Default2) Основной конструктор называют Foo::new3) Часто доп. конструкторы называют Foo::with_bar
>>1391275>3) Часто доп. конструкторы называют Foo::with_bar Бля, я тут как раз читал одни сырцы и не мог понять такую конструкцию: world .create_entity() .named("Plant") .with(PlantTag) .with(collider::Circle::new(0.8)) .with(mesh.clone()) .with(handle.clone()) .with(transform) .build();Я так понимаю всё что после имени это что-то типа ступенчатого конструктора?Если интересно, это какое-то студенческое поделие на аметисте.
>>1391436> Я так понимаю всё что после имени это что-то типа ступенчатого конструктора?Это паттерн builder. Очень популярен в Java.
>>1392678я не уверен, что у инстанса нужно указывать его "ссылочность". попробуй _ => { Err }.или &_a => { Err } если я не прав
Дващ, насколько правильно я вообще подхожу к задаче:тележка имеет некоторую скорость V в некоторый момент времени t0. На тележку действует сила трения качения в продольной оси и сила трения скольжения перпендикулярно ей. Найти вектор скорости тележки в некоторый момент времени t1 = t0+dt.Я вот схему захуярил - чёрный это скорость V (зелёный - neg(V), просто штоб было), красный - направление продольной оси тележки, её "перед". Поносно-жёлтый - это трение, трение качения маленькое, а трение скольжения большое.У меня было решение на num через комплексные числа, но я пытаюсь перепилить на nalgebra, и по пути может оптимизировать, если есть что-то умнее.Вот на num (self.friction_coll - продольное трение, self.friction_orth - поперечное, self.heading - угол между передом тележки и x axis):fn calculate_velocity_after_friction(&self, vel: Complex<f64>, dt: f64) -> Complex<f64>{ let coll_f = -Complex::from_polar(&(self.friction_colldt), &self.heading); let orth_f = Complex::from_polar(&(self.friction_orthdt), &(self.heading+(std::f64::consts::PI/2.0))); let denom: f64 = coll_f.reorth_f.im - orth_f.recoll_f.im; let mut a = (coll_f.revel.im - vel.recoll_f.im)/denom; let mut b = - (orth_f.revel.im - vel.reorth_f.im)/denom; if a > 0.0 { a = -a; } if b > 0.0 { b = -b } if a < -1.0 { a += 1.0; } else { a = 0.0; } if b < -1.0 { b += 1.0; } else { b = 0.0; } aorth_f + bcoll_f }
>>1393142Код не понял и не вчитывался, линалом в расте не пользовался, но было дело в других языках. Мой совет -- делай так, как ты бы делал в школе на уроке физики. У тебя есть начальное положение s0, начальная скорость v0 и уже посчитанные силы. Считаешь результирующую силу F, это ведь просто сумма всех векторов. Считаешь вектор ускорения как a = F/m. Интегрируешь самым простым методом Эйлера новую скорость (v = v0 + dt * a). То же с положением. Раз ты в физике -- не выходи за пределы домена физики.Боюсь представить, как ты силы трения вычислял. Там же проекции брать надо, скалярные произведения делать, а у тебя в коде даже функции нормирования отдельной нет.
>>1393233Алсо, можешь посмотреть https://youtu.be/LoTRzRFEk5I по темеЯ сам давно смотрел это видео, но обычно Кейси довольно доходчиво всё объясняет.
у Programming Rust нет дополненных изданий? гугл ведет в O'Reilly и книге декабря 17го. наверное, в языке с тех пор что-то поменялосьили после обосранного итт растбука Proramming стоит прочитать прям совсем по касательной, дабы освежить/улучшить понимание некоторых вещей?
>>1393233>>1393233>Считаешь результирующую силу F, это ведь просто сумма всех векторов.Ты простой такой, аж зубы сводит.Подумай на досуге, что если по одному из измерений вычисленное изменение скорости за dt будет больше чем имеющаяся скорость? Тележка покатится в обратную сторону под действием силы трения? Норкоман?>Боюсь представить, как ты силы трения вычислял. Там же проекции брать надо, скалярные произведения делать, а у тебя в коде даже функции нормирования отдельной нет.Это и есть отдельная функция. Нахуя мне выносить нормирование куда-то ещё, если оно мне не нужно больше нигде? Понадобится - отрефакторю.Короче, гуляй нахуй отсюда, профессор "код не читал, но осуждаю".
>>1393238Я знаю кинематику получше тебя, осмелюсь предположить. Можешь засунуть свои школьные видео себе в жопу.Спрашивал, есть ли более умный способ, чем разложить вектор на базис и вычислить поэлементную векторную сумму.Вроде прикола с квейком, где они извлечение корня заменили умножением и сложением.Нет, школофизики меня будут векторам учить.
>>1393321>>1393323>код не читал, но осуждаюПотому что твой говнокод трудно читать, делать мне на дваче нечего больше. Да и четыре условия у тебя в функции -- бранч предиктор охренеет и именно на нём твоя функция и тормозила бы. Если бы у тебя были нормальные функции для работы с векторами, ты бы сделал как-нибудь так:orthPart = min(project_len(V, orth_f) - len(orth_f), 0) norm(orth_f)collPart = min(project_len(V, coll_f) - len(coll_f), 0) norm(coll_f)По мне, работать с голыми координатами, когда у тебя есть нормальная геометрическая интерпретация - неблагодарное дело. Без бранчей, кстати SIMD-зируется - вот тебе ещё и (минимум) трёхкратное увеличение производительности
>>1393574И вот так при помощи одного вменяемого ответа ты превратился из прохожего мудака в уважаемого господина.
>>1393604Хотя я уже вижу различия, при создании std::unique_ptr из другого unique_ptr, мы можем сделать borrow в С++, но когда созданный unique_ptr уничтожится - reborrow не произойдёт. Так что это не полное соответствие.Крестушок
>>1393608>при создании std::unique_ptr из другого unique_ptr, мы можем сделать borrow в С++,Ты хотел сказать, мы обязаны сделать move? Причем здесь borrow?
>>1393650Да, я чёто перепутал концепции. Блин, лучше не пытаться маппить это всё на уже известный мне С++, получается фигово.
В общем хочу попробовать раст, сам я фронтендер, но чето заебало, хочу экзотики. Что интересного можно поделать на расте то?
>>1393986Операционку написать.Реализацию TCP/IP стека.Любым байтоёбством заняться, которое тебе по душе.
>>1393986Да ты сначала задачи порешай, после жса охуеешь, базарю. Я после питона охуеваю и пишу по 3 часа то, что на питоне за 10 минут наебенил бы.
>>1393986Для начала растбук прочитай/прорешай.Если не знаешь английский на достаточном уровне - не лезь, материалов на русском мало.
Делаю тут веб-сокет сервер с использованием крейта websocket, и столкнулся с несколькими проблемами:Для того чтобы броадкастить полученное сообщение всем подключенным клиентам, мне нужно где-то хранить всех подключенных клиентов, я использую HashMap с Arc и RwLock чтобы безопасно шарить его между тредами:let mut clients = Arc::new(RwLock::new(HashMap::new()));Далее, для каждого входящего соединения создаю новый тред:for connection in server.filter_map(Result::ok) { let mut connections = connections.clone(); thread::spawn(move || { ... }}Внутри каждого треда я делаю accept подключения, получаю IP клиента, и разбиваю подключение на две части - приемник и отправщик (так сделано в крейте):let client = connection.use_protocol("ws-test").accept().unwrap();let ip = client.peer_addr().unwrap();let (mut receiver, mut sink) = client.split().unwrap();На этом этапе у меня есть sink, соответственно я могу заполнить мой HashMap для использования в дальнейшем:connections.write().expect("RwLock is poisoned").insert(ip, sink);Тут появляется первая проблема, т.к. происходит ownership transfer переменной sink в HashMap. Если передавать ссылку, то компилятор говорит что borrowed value does not live long enough, очевидно потому что HashMap находится за пределами треда, а значение которое я пытаюсь передать по ссылке умрет вместе с тредом. Это вызывает проблемы далее.После этого, если сообщение на сервер пришло, я пытаюсь отправить его всем клиентам которые есть в connections вот таким образом:for (_, client) in connections.read().expect("RwLock is poisoned").iter() { client.send_message(&message);}Компилятор выбрасывает ошибку: `client` is a `&` reference, so the data it refers to cannot be borrowed as mutableКак я понял, client это не mutable reference, и из-за этого переменная cannot be borrowed as mutable.Я пробовал поменять iter() на iter_mut(), но тогда возникает та же ошибка, но в другом месте (где вызывается iter_mut():55 | for (_, client) in connections.read().expect("Posion").iter_mut() { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot borrow as mutableНа этом моменте я зашел в тупик, не понятно что я делаю не так? Почему при попытке вызвать iter_mut() borrowing недоступен? Извиняюсь если очень тупой вопрос, учить язык я начал недавно.
>>1394156Сам спросил, сам ответил, и вопрос действительно глупый. Поменял connections.read() на connections.write() и все заработало. Я же правильно понял что read() не работал из-за того что это чтение, соответственно возвращается immutable reference, а функции send_message из моего кода нужен был &mut self?
>>1394004>Любым байтоёбством заняться, которое тебе по душе>байтоёбствомМаняфантазии подъехали. Впрочем, ничего удивительного в пидортреде не вижу. Раст как был для 0.5% задач создан, так его и используют. Больше он нигде и ненужен, особено впечатляют маняпроекты с версиями 0.0000012141412 с припиской build with rust. Тьфу блять, аж противно. Интересно, что зашкварней, писать такое говно на хуясте, писать бек на пхпдерьме или жрать говно вместе с жс? Оставляю на ваше усмотрение, инфантильные ублюдки.
>>1394439Ты припёрся хуй пойми откуда специально, чтобы рассказать какое раст говно и какие мы инфантильные ублюдки?Ебать пичот.
Ананасы и ананаски. Вопрос: а что, собсно, мешает нам расшарить данные между тредами в read-only режиме? И, если что, конпелятор пусть ругается на попытку записи в расшаренные данные. Я, конеш, понимаю, что можно клонировать и всё такое - но это лишние действия и не все структуры это поддерживают.Вот хочу я вектор расшарить - в чём проблема одолжить его треду, а ниже перехватывать попытки записи (но не чтения) в одолженное?
>>1394845Зацени пример. Типа, посылаешь ты вектор в тжред, тжред из него чего-нить печатает, а тем временем в главном треде ты тоже чего-нить из него печатаешь.
>>1394873Ну, а если типа прикрутить к объекту счётчик одалживаний, типа как монадой, и менять его при каждом новом одалживании. Кому не нужен - пусть уменьшает счётчик, если, внезапно, 0, то удаляем объект. Или это уже gc получится?Arc/Mutex какое-то дно ебаное и оверкилл, когда нужно только чтение в потоках.
>>1394878https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6348811fedaaaeac7e92b8772f8aab6c
Во, >>1394943, спасибо. А то я чувствую, что лочить каждый раз перед всего лишь чтением, это не дело. Сцук, а примерах почти везде Arc+Mutex.
Двач, обесни, что это за синтаксис такой:let mut physic_world = world.write_resource::<::resource::PhysicWorld>();дженерик функцию я пойму, там func<T>(a: T), но что такое бле func::<T>()?
Котоны, кто-нибудь следит за аметистом? Че у них там происходит? Они опять перепиливают подсистемы и сломают все к следующему релизу?
>>1395659Я его ковыряю вторую неделю, но следить не слежу. Откуда твоя информация?Я только слыхал что они в следующем релизе вроде как вулкан выкатывают.
>>1395680Потому что каждый релиз "мы все нахуй переделали".Сначала они поменяли мат. либу. Потом вроде как перепилили половину апи. И вот скоро опять перепилят с вулканом или че там будет.А делать что-то на либе, которая каждый релиз ломает обратную совместимость мне совершенно не хочется. Я так уже с ggez поебался.Хочется понять какие у них планы и когда ожидается стабилизация.
>>1395681>Сначала они поменяли мат. либу.То есть ты бы предпочёл чтобы они остались на ящике, который перестали поддерживать что ли? Ебать психопат.>А делать что-то на либе, которая каждый релиз ломает обратную совместимость мне совершенно не хочется.Добро пожаловать в мир early-софта, всё сырое и меняется, ищешь стабильности - пиздуй в ANSI C.
>>1395683Нет, я за то чтобы они на главной повесили ссылку на план, если он у них есть, чтобы я понимал когда ожидать стабильный релиз и каков прогресс. Например вот так: https://prod.teamgantt.com/gantt/schedule/?ids=843041&public_keys=eXjoWRdx8pM7&zoom=d100&font_size=11&estimated_hours=0&assigned_resources=0&percent_complete=0&documents=0&comments=0&col_width=255&menu_view=0&resource_filter=0&name_in_bar=0&name_next_to_bar=1&resource_names=0#user=&company=&custom=&date_filter=&hide_completed=false&color_filter=&ids=843041Чтобы я не спрашивал на двачах или в дискорде, а мог зайти раз в месяц и посмотреть как прогресс.
>>1395685>чтобы я понимал когда>Чтобы я не спрашивалНе, это тебе в платные конторы. Очень немногие опенсорсные поделия могут себе позволить такую степень серьёзности, чтобы прям тебе всё было удобненько, сорян.Было бы круто, но нет, нихуя, ожидать серьёзного плана с аннаунсментами и майлстоунами от трёх с половиной анонимных школьников - неее...
>>1395692Этим анонимным школьникам заслали бабла. Ну и на всякий случай, я ничего не требую, а лишь говорю что для популяризации проекта было бы неплохо иметь в легком доступе подобную информацию. Хотя бы в минимальном виде: "релиз 0.11 ожидается через 3 месяца, и мы опять сломаем обратную совместимость, сорян пацаны".
https://boats.gitlab.io/blog/post/await-decision/Ну что, какова вероятность что вот эту няшность загнобят сярпо/жсниггеры?Лично мне что-то прям шишка стоит от постфиксного await. Показал дружку и он грит, вообще не читаемо
>>1395815> вообще не читаемоОн прав же. Вообще хуевое решение, как кажется. И аргументировать это в том числе тем, что "подсветка в иде поможет" это такое себе. Хуевый язык, если без подсветки писать нельзя.Может я читал через жопу, но в статье так и не увидел чем же постфиксный вариант лучше.
Анон, такое дело. Есть у нас T, который не реализует Copy или Clone (а может и реализует, но нам хочется дженерик). И тут я, такой хитрец, хочу сделатьlet Vec<Option<T>> = vec![None; 999];и тут оно меня радуетthe trait `std::clone::Clone` is not implemented for `Entry<T>бля, сцук, конпилеру какое дело, чего там T имплементит, когда у нас одни None? Я бы не бухтел, но оно же даёт сделатьlet Vec<Option<T>> = Vec::with_capacity(999);Что мешает сразу при создании нонами забить и всё?
>>1395919https://doc.rust-lang.org/std/macro.vec.html> This will use clone to duplicate an expression, so one should be careful using this with types having a nonstandard Clone implementation. For example, vec![Rc::new(1); 5] will create a vector of five references to the same boxed integer value, not five references pointing to independently boxed integers.
>>1395919https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=25039ac0007934f03285c66d0f419e77
>>1395916ну типа шо оператор ?, который будет юзаться практически всегда с асинками сделает из раста лисп. а с постфиксом чейнить foo().await.bar().await станет чуть читабельней
охуенный растбук: книга пишет "вот вам код, но он не скомпилится потому, что а, б, ц. и надо его подправить". но он берет и компилится
>>1396250Но ведь есть нормальный вариант await pizdets. Насколько мне известно, оно сделано так почти везде (питон, джс, шарп из того, что трогал), и выглядит оно, ну, нормально. Собственно хули бы так не сделать то? Нахуй выебываться и делать какой-то специальный кейс, где у нас ебучий .await синтаксис?
>>1396251Вот тут должно быть подробней:https://paper.dropbox.com/doc/Await-Syntax-Write-Up-t9NlOSeI4RQ8AINsaSSyJСейчас сам прочитаю и кратко перескажу.
>>1396269Мне лично вообще-то нравится угашенность Раста, но вот этого пидора двачану.Некоторые решения используются везде просто потому что они лучше всего подходят к задаче.Не надо без нужды усложнять людям перекат из других языков.
>>1396290Если вкратце, то использование префиксного варианта выглядит уебищно в сочетании с обработкой ошибок:(await future)?;(await future).context("An error occurred.")?;А т.к. асинк почти всегда связан с IO, то почти в любой асинк операции будет обработка ошибок.future.await?.foo.await?vs(await (await future)?.foo)?
>>1396438Ну сравни синтаксис на промизах из жс с async/await там же.Тут такая же история, только текущая асинхронщина еще менее читабельная.
>>1396423в дотнете примитивами (не очень) синхронизации и ручным пердолингом потоков. выглядит так себе, хотя для большинства случает синхронная версия шустрее асинхронной из-за отсутствия переключения контекста
Нормально ли в расте вытаскивать набор символов из строки просто захерачив HashSet из итератора по символам?
>>1396633Я например в языке недавно, но чёт не могу представить, почему бы это было ненормально. Везде и всегда так делали, разве нет?
>>1396761Ого, разница почти в два раза. Так и думал, что есть какой-то более оптимальный способ. Откуда вот его взять надо было? Не измерять же время каждый раз -- больно много телодвижений. По питону вот для таких задач часто в книгах пишут, что быстрее работать будет или просто как лучше сделать, потому что, мол, питон вообще не про производительность, а лапша будет выглядеть куда хуже, чем просто запилить set. А тут как быть? Не помню, чтобы видел что-то такое в растбуке.
>>1396852Для этого нужно изучать матчасть.У способа с сетом сложность o(n), в то время как у вектора с сортировкой как минимум o(n lgn). То есть в теории сет быстрее, но на малых n вектор дает преимущество. Это не привязано к языку особо.
>>1396873так и знал, лулв качестве альтернативы (правда, затратной по памяти) можно было использовать хэшсет рядом с вектором, чтобы не форсировать сложность дистинкта в N х log(N)
>>1396882я имею ввиду задачу дедупликации для вектора решать путем создания хэшсета. в реализации dedup(), а не подразумевать, что вызывающий код накатил sort() сперва
>>1396937ну пчему. для задачи когда у меня есть здоровенный вектор и мне нужно получить тот же самый вектор без дубликатов и без перестановки элементов. это рядовая задача на каких-нибудь шарпах, например
>>1396943а, ну бываетхоть это и сторонний крейт, лол. но для опенсорсного языка это не так уж и удивительно
>>1396856То есть, лезть в исходники и смотреть реализацию? Сложна.Интересно, начиная с какого размера хэшсет быстрее будет?
Аноны, вопросы на миллион потоков1. как и почему Arc реализует Send? Ведь перед передачей в другой тред нужно сделать clone, иначе работать не будет, а после clone это уже другой экземпляр, вроде как.2. вот есть у меня какая-то структура, я сказал конпелятору, что вот, молunsafe impl Send for MyStruct {}что, уже можно передавать в потоки, не оборачивая в Arc? Ну, на чтение, хотя бы.
>>1396852> Не измерять же время каждый раз -- больно много телодвижений.Как раз это и советуют везде.
>>1398406>после clone это уже другой экземпляр, вроде какЭто всего лишь другой экземпляр указателя, который инкрементирует внутренний счетчик ссылок (Arc - atomic Rc, Rc - reference counter).>что, уже можно передавать в потоки, не оборачивая в Arc?Можно, но лучше не стоит. Многопоточное чтение будет работать нормально только со значением, которое не меняется.
почему видимость модулей и организация файлов в растопроекте это такая пекучая боль?естьsrc-- grammar---- mod.rs---- nodes.rs---- trees.rs-- main.rsчтобы достучасться из main к каким-то структурам в grammar::nodes, мне нужно обьявить mod.rs в grammar и ре-экспортировать "модули", которые нихуя не модули, а просто файлы *.rsчтобы тесты в каком-нибудь trees.rs запустились, мне нужно их подсунуть поближе к мэйну, иначе карго их просто не увидит. та даже обычный код не компилится, если он не экспортирован чем-то, что от точки входа идет вниз по дереву пути. вангую, что бинари не совсем должны содержать в себе тесты и карга имеет полное право скипать то, что не попадает под его поле обзорано у меня даже с тестами периодически возникает какая-то борода, как на пике. компилятор успешно подсвечивает ворнингами то, что некоторые методы и структуры, которые обьявлены парой строк выше, не используются. но тестов мы не видим в упор. объявление модуля tests как публичное было уже шагом отчаяния, но и это не спасает
>>13991381. почему у меня не ранятся тесты, обьявленные в файле, хотя структуры и методы в нем же проходят компиляцию?2. почему пути в расте - это такой леденящий душу пиздец?
>>1399230Попробуй идейку - мне она автоматом перенесла тесты в отдельный файл и все импорты прописала.Алсо>.exeфи
>>1399288soooooqa, какая же она вырвиглазная. а можно одной кнопкой сделать так, чтобы не хотелось блевать, глядя в монитор?
>>1399698Смотря что раздражает. Если вот эти типы, то disable hints где-то в настройках. Если внешний вид, то попробуй материал тему накатить (в плагинах).
>>1399769твое выглядит неплохо. но, подозреваю, дело в шрифте, который неконтрастно выглядит курсивный и обычный. попробую пошаманить, хоть и влом
Я начал вкатываться в раст, дошёл до темы типажей и не совсем понял зачем они нужны. Методы в типажах вроде как перезаписываются с помощью impl, в таком случае, зачем тогда вообще нужен trait, если можно воспользоваться только одним impl без trait?Возможно это тупой вопрос, но лучше я спрошу, чем буду 10лет ебаться.
>>1399997Это как интерфейсы в ООП-языках. Ты можешь сказать, что функция принимает в качестве аргумента (или возвращает) объекты, которые имплементируют трейт(ы) и использовать его методы, а на то какие конкретно объекты туда поступают тебе похуй.
>>1399997Ты можешь какой-нибудь своей структуре заимплементить Iterator (всего лишь один метод https://doc.rust-lang.org/std/iter/trait.Iterator.html#required-methods ) и потом получать с этого тонны плюшек (например получить кучу других методов https://doc.rust-lang.org/std/iter/trait.Iterator.html#provided-methods , использовать в фор, в функциях которые принимают итератор, даже другие либы которые принимают итератор смогут работать с твоей структурой).В расте есть уже куча функций которые принимают трейтнейм, а про твою структуру (которой ты хочешь сделать импл) они понятия не имеют, но если ты прицепишь нужный трейт, то они подружатся и, как итог, меньше придётся своего кода писать.
>>1400292https://ru.wikipedia.org/wiki/%D0%A2%D0%B8%D0%BF%D0%B0%D0%B6_(%D0%B0%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D1%8B%D0%B9_%D1%82%D0%B8%D0%BF)
>>1400296мог бы просто ответить traitмне просто первое, что пришло в голову - это кортежи, tuples. но народ че-то про трэйты начал втирать
>>1400653Ай синк уи донт нид ту транслейт уордс фром Инглиш то Рашин. Морове, иу маст ту транслейт Рашин уордс ту Инглиш, бекоз инглиш из мо бьютифул.
>>1400720Я слышал все три варианта от нейтив спикеров. Их даже георафически не разделишь. Абсолютно рандомно разные люди говорят "тьюпл", "тупл" или "тапл". Иногда даже один и тот же человек.Это как с either/neither.
>>1400989Просто белые господа - представители высшей расы работают с tuples, traits and slices, а грязные необразованные пейзане - ебутся с кортежами, типажами и срезами. Неосиляторы тут вообще ни при чём.
Анонасы, какого хуя?https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=09856d3da0d3ea453e0509daf3e108fc - работаетhttps://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6148fab1b7cae90c859ed20904047f99 - то же, но в цикле не работает
>>1401793https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0ff1efc4efdca01c2e09e6a1cfa4e29b
>>1401805Разница в том, что ты забыл итерируешь по вектор по ссылке и делаешь move трансмиттера. Чтобы починить твой пример, нужно его склонировать:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a76813d1f723ab24f50c9c8489e2ef02
>>1401813Тьфу, блядь:> Разница в том, что ты итерируешь по вектору по ссылкам, и делаешь move трансмиттера.
>>1401813>move трансмиттератак. Почему в моём варианте его мувать нельзя, а в твоём >>1401801 можно?И почему конпелятор ругается на что угодно, только не на этот нехороший move?И ещё вопрос - если я переместил объект в Arc, как его выместить обратно?
>>1401825Компилятор тебе ровно на это и ругается.В моем варианте я сделал два вектора и сделал into_iter() по вектору трансмиттеров, соответвенно move спокойно отрабатывает.https://doc.rust-lang.org/std/sync/struct.Arc.html#method.try_unwrap
>>1401828>into_iter()Ясн, типа клонировал с заднего двора его. Могли бы сюда https://doc.rust-lang.org/book/ch16-02-message-passing.html добавить эту тонкость.
>>1401831Нет там клонирования никакого. Можешь вот тут почитать детальней: https://doc.rust-lang.org/std/iter/index.html
Ладно, умный анон, тебе всё равно делать нехуй. Давай, расскажи нам, как передать в функцию другую функцию аки параметр и засылать в тжреды уже её. Суть:1. у меня есть набор функций, делающих всякое разное, но с одними данными2. делать разное надо последовательно, но сами данные неплохо бы обработать параллельно3. написать бы для этого единую ф-цию с дженериками, чтобы параллельно звала некую f для данных и возвращала каждый раз разное Thttps://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0ff1efc4efdca01c2e09e6a1cfa4e29b - nikaqueда, я всё ещё ни хуя не понял
>>1401965https://doc.rust-lang.org/std/ops/trait.Fn.htmlКонкретней надо. Покажи пример данных и функций.
>>1401968Упс, не тоhttps://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=35c3ca7bf1ee29837296f863a918b00eНе в дженерик виде оно у меня есть и работает - с вызовом известной функции проблем нет. А вот если снаружи передавать, то никак.
>>1401971https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6cd6e8091eafb5725f62df90b48558c1
>>1401965Почему бы не использовать Arc? https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=30cfd5c0f2572058d7625574fc2d020c
>>1402018Arc пробовал, но что-то не завелось. Быть может всё дело в щепотке dyn? Так и не въехал, что это.>>1401971А вот 'static в нужные места втыкать я тоже ещё не научился. Оно, вообще, кошерно ли? Утечек не будет, если часто юзать?
>>1402033Какая связь между статик-лайфтаймом и утечками?Нужно научиться читать сообщения компилятора, он подсказывает что и куда нужно добавить.
>>1402033> Быть может всё дело в щепотке dyn?dyn - динамическая диспетчеризация, impl (или шаблонные параметры) - статическая. Можно заменить dyn Fn(usize) -> R + Sync + Send на impl Fn(usize) -> R + Sync + Send + 'static, но тогда использовать Arc уже не имеет смысла.
>The Little Book of Rust Macrosна сие поделие стоит тратить время, или может в Programming Rust про макросы рассказывает поадекватнее?
Растоманы, подскажите додику как в tcpstream засунуть жипег, так что бы можно было спокойно вытащить из аджакса на клиенте
>>1402379Возьми и закешируй. Вопрос был про то как писать в стрим, а не про то как это делать эффективно.
>>1403182С хуя бы? Непрямой доступ к памяти по дефолту более медленный чем копирование пары слов через стек или регистры. Вопрос в том, в какой момент копирование plain-old-data структуры становится более дорогим, чем обращение через ссылку.
>>1403186У тебя запись в стек идет через L1, т.е. тебе надо часть кэш линий вытеснить из L1 для записи новых значений. Если они уже записаны в L2 или не менялись, то все хорошо. Иначе ждать пока запишутся в L2. В принципе конечно возможна ситуация что вершина стека и прилегающие области находятся в L1 недавно был вызов функции и возврат из нее - тогда тут все будет проще.С другой стороны ссылку можно и через регистр передать, а если с данными недавно работали, то они будут в L1.Мое мнение: тут без бенчмарка нельзя сказать ничего определенного.
https://play.rust-lang.org/?gist=c3db81ec94bf231b721ef483f58deb35Как правильно такое писать? Потому что это > pub prev: Option<Weak<RefCell<Node<T>>>>,выглядит ужасно.
>>1403357Вот так: https://doc.rust-lang.org/std/collections/struct.LinkedList.htmlА вообще это одна из худших структур данных, так что подумай зачем оно тебе вообще нужно.
>>1403357Рискну предположить, что если ты не совсем уверен, как такое писать, тебе лучше воспользоваться другой структурой.
>>1403369>одна из худших структур данныхоригинальное заявление. если бы каждая структура данных не была заточена под свою задачу
>>1403421У списков одни из самых хуевых характеристик для типовых задач. Иногда в редких случая они нужны, но чаще всего нет. При этом по какой-то причине эти списки пихают бедной студентоте в начале обучения.В лиспе и хаскеле списками еще можно обмазываться, но не в расте же.
>>1403447>по какой-то причине эти спискиПотому что если студентоте сразу дать красно-чёрные деревья или пытаться объяснить A* по графу, у них мозги вскипают. А если начать со связанных списков, то оно проще заходит.
>>1403473Ну так начинайте с векторов, хештаблиц и бинарных деревьев.Впрочем да, если надо научить работать с указателями и не проебываться с граничными случаями, то списки хороший пример.
>>1403475Я так-то хз, но у нас предмет "Структуры данных" как раз и начинался с хешей и простых деревьев и там дальше. Но чтобы хотя бы это понимать, вводный курс, там где совсем банальщина, CS101, там списки были, чтоб пойнтеры осознавать начинали потихоньку.
>>1403657комплексую чего-т. Зато я за режимы работы транзистора 3 раза пояснять сдавать ходил. Такой вопрос - есть в треде расто-пофессионалы (кто кодит на нём за деньги) или одни любители собрались?
>>1403733О, молодец. И как оно?Ещё вот такое:where F: Copy+From<f32>+std::ops::AddAssign+std::cmp::PartialOrd+std::ops::Div<Output = F>можно как-то проще обозначить, что я хочу всего-лишь задать обобщённый тип с плавающей точкой? Возможно даже всего из 2х вариантов: f32|f64
>>1403756Вот это охуенное упущение дизигнеров языка. Хотя бы в рамках примитивных типов могли бы сделать. Чтобы я писал что-то вроде<T: PrimitiveFloat>а потом мог бы спокойно писать 'as T' и всё такое
>>1403751Что именно? Раст охуенный, но не идеальный. Время компиляции подбешивает, и тулинг хочется получше.
>>1403369> А вообще это одна из худших структур данных, так что подумай зачем оно тебе вообще нужно.На самом деле мне нужно было минимальное trie для задачи на hackerrank, но у меня возникли проблемы с портированием работающего прототипа на питоне. Решил загуглить реализации простых структур данных на расте, вот и наткнулся на ту ссылку.Почитал исходники LinkedList, это определенно лучше, пусть и с unsafe, но в итоге я забил и просто запихал все ноды дерева в вектор, а вместо указателей сделал индексы на него.
>>1403770>Раст охуенный, но не идеальный. Время компиляции подбешивает, и тулинг хочется получше. Две виртуалки с ансиблем этому инженеру.
>>1403868Это почти как спрашивать, почему встроенного вебсервера нет, лол. Потому что разрабам не показалось это важным.Сделай. Нужно всего-лишь потребовать, чтобы у типа был унарный минус и операторы сравнения.
>>1404651Конечно можно. Ну вот смари: мне для функции, работающей с дженериком F, нужно писать такую ебалу:where F: Copy+From<f32>+AddAssign+std::cmp::PartialOrd+Div<Output = F>+Sub<Output = F>+Neg<Output = F>+Add<Output = F>+Mul<Output = F>хотя F у меня может быть либо f32, либо f64 - и вот для такого простого случая нужно городить такой огород (причём, его приходится тащить в каждую функцию). Хотя можно было бы изобразить что-то вроде F: (f32|f64) или тип того. Про сторонние крейты знаю, не предлагать. То есть, с одной стороны в языке куча сахара (как компенсации за ёблю с бч), а с другой - нет такой элементарщины.Ещё нашёл #![feature(trait_alias)] - оно в анстейбле. Зато с ним можно такtrait X<F> = Copy+From<f32>+AddAssign+std::cmp::PartialOrd+Div<Output = F>+Sub<Output = F>+Neg<Output = F>+Add<Output = F>+Mul<Output = F>;и потом писать вездеwhere T: X<T>; //Пиздец, не правда лино всё равно костыль, да и не факт, что даже его стабилизуют.
>>1404788Чур внешними костылями не бросаться. Я про то, что должны быть или типы высшего порядка, или чего-то вроде возможности создать свой по типу union.
>>1404804>Чур внешними костылями не бросаться.А я не совсем понимаю, почему тебя внешние костыли не устраивают.
>>1399698А нахуя ты изобретаешь велосипед? Есть же pest.rs, который сгенерит тебе синтаксическое дерево и парсер под него по описанию грамматики, всё на этапе компиляции, без оверхеда времени выполнения, ты всё равно лучше в жизни не напишешь.
>>1404964Тем, что это костыли под специальный случай, а я хочу вообще. Может у меня вообще так случится, что T будет в диапазоне от u8 до f64.
>>1404732>То есть, с одной стороны в языке куча сахара (как компенсации за ёблю с бч), а с другой - нет такой элементарщины.Элементарщину реализовать можно средствами языка, а сахарок нет, лол. Ты не можешь ожидать, что любая херня, которая тебе только может понадобиться, окажется в стандартной либе, она не для этого.>>1405085Там уже есть трейт Num, который покрывает любые операции над числами. Чувак сам не знает, чего хочет.
>>1405143>Там уже есть трейт Num, который покрывает любые операции над числамидженерики он хуёво покрывает. Даже если T: Float, я всё равно не смогу написать2.3Tили2.3 as Tпри этом, внезапно, он не включает std::convert::From<{float}>поэтому даже into() с ним одним не заведётся.
Ну шо, накатим https://blog.rust-lang.org/2019/05/23/Rust-1.35.0.html (хотя не особо много полезного, разве что .contains() в Range и Fn для Box<dyn Fn> ничо так).
>>1405621>Fn closure traits implemented for Box<dyn Fn>почему мне делегат нужно все-равно упаковывать, ебанаврот. после дотнетовских анонимных функций как-то сложно уговаривать компилятор не ругаться. хотя, и язык не о том
>>1405657Делегат-дегенерат. Почему объебки из микрософта всегда придумывают какие-то новые термины для простых устоявшихся вещей?
>>1405666ну closure - это немного не о ссылке на функцию, а о доступе к данным вне её. это даже в жявяхуяваскрипте замыканием называетсяили о чем ты?
>>1405666>объебки из микрософтаУ тебя ответ в самом вопросе. Блядская компания, блядские продукты, блядская культура и блядское комьюнити.
>>1405710Он про майкрософт-онли фанатиков, которые на каждом углу орут о том какой си-сярп охуенный, не видя что им подсунулу перекрашенную жабу.
>>1405697Но visual studio code - единственный редактор, в котором можно нормально разрабатывать на расте в 2к19.Как жить-то?
>>1405904Сам не понимаю, бред какой-то. Парадокс. Пытался Атом это самое, вроде неплохо, туда-сюда, но VS-выродок всё равно лучше.Часть плана MS по угнетению опен сорса, наверное. В линупс они три года назад вкатились, гитхаб в прошлом купили, ждём когда вся экосистема накроется медной пиздой.https://en.wikipedia.org/wiki/Embrace_extend_extinguish
>>1405904Если ты готов мириться с электронными тормозами, то живи с ним.Емакс и вим никто не отменял в 2019.
>>1405920За вим ничего не скажу, но удача как раз нужная тому, кто через дерево-файлов или прости господи табами пользуется.Это примерно такое же днище как альт-табаться постоянно.
>>1405921А чем надо пользоваться, когда у тебя вложенность в 4-5 директории, ручками вбивать все пути как додик?
>>1405924Ну это заебись, пока у тебя 4 файла в одной папочке, когда у тебя будет 50 в 10 папках, так же будешь щелкать, пока белый человек один раз кликнет на файл в дереве проекта?
>>1405927Хз, в моем хобби проекте 300+ файлов в хуй знает каком количестве директорияй. Как по мне если бы мне надо было щелкай мышкой для навигации, я бы повесился.
>>1405920Недавно видел относительно удобно настроенный neovim для раста и не только:https://www.youtube.com/watch?v=ycMiMDHopNcПро вим начинается в 13:45, c 17:00 работа с файлами через fzf.
Аноны, а кто-нить пользовался этим: https://github.com/AdamNiederer/faster - SIMD акселератором?А никак не могу заставить его схавать 2 итератора. Можно, конечно, сделать flatten и collect, но как-то некошерно.И, к вопросу о внешних костылях, он работает только из гита, в репах сломанная версия.
>>1406096>в репах сломанная версия.если у тебя ночной конпелятор, то это может не в репах сломана версия, а конпелятор у тебя несовместимый
>>1406397Это SIMD, он только с ночником и совместим. А так, если в мастере типа нестабильная версия, но работающая с последним ночником, а в репе стабильная, но работающая с конкретным ночником - дак могли бы указать версию ночника-то.
Смотрите, аноны, чего нашёл: https://github.com/MikhailKravets/NeuroFlow/нашёл эту либу, заюзал, решил попробовать с генератором. А его и нет. Лезу в сорцы - и правда нет, но: для передачи в train() ему и не нужен полный датасет, всё необходимое вынесено в отдельный трейт с 3-мя методами, который мне и осталось заимплементить для своего генератора.И вот он продумал же, малаца прям.Но одно пугает - все МЛ проекты на расте либо совсем новые, либо застопорились в 2018 и раньше.
>>1409099https://github.com/autumnai/leaf есть постарее и он даже был относительно популярным, но умер.
>>1409255Как по мне, это говорит о том, что энтузиазм вокруг раста велик, но самих энтузиастов пока мало. Сначала у человека хватает энтузиазма реализовать что-нибудь эдакое, но потом для продолжения ему не хватает фидбека в виде багрепортов и донатов - и всё стопится.Ещё заметил, что авторы таких проектов зачастую студенты, которым после окончания обучения надо что-то кушать.
>>1409678https://medium.com/@mjhirn/tensorflow-wins-89b78b29aafb причины тут. Датасайентистам проще питон. Торч который без Пи скорее всего по этой же причине менее популярен.
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=ea561ec41cc42ad0cacfbe18d786a7ecа зачем:mut peremennaya_name: &mut ImyaTipa?
>>1411171https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=dcbec378b36a06d38e282edb37aa478aНизачем.
и снова я неосиляю пути в расте, ебаны_их_в_ротструктура файлов простая:/src|_ utils.rs|_ types.rs|_ tests_1.rs|_ tests_2.rsutils ссылается для своей работы на types. tests шо 1 шо 2 ссылается на общий utils.сам проект целиком и полностью состоит из тестов на уже развернутое независимо окружение (конечно, лолблядь, но это просто по гайду ради примера)если в Cargo.toml указать [lib] path = "src/tests_1.rs", но по-отдельности потестить тесты получится. но чтобы запустить все разом, я хочу объединить их в каком-нибудь ентри-поинт файле. например main.rs:mod tests_1;mod tests_2;src/tests_1.rs:file not found for module `types`help: name the file either content\types.rs or content\types\mod.rs inside the directory "src"я перепробовал еще вариантов экспорта, но там либо uknown crate или синтаксическая ошибка.как воркэраунд я надекларировал в Cargo.toml [[bin]] с путями, а в тест-файлах создал пустые fn main(). но это какой-то кек, как по мне. вообще есть адекватный способ создать иерархиеские зависимости модулей в пределах одного уровня директорий?
>>1411692https://doc.rust-lang.org/cargo/guide/tests.htmlЕсли смотреть сюда, то по логике просто сложи тесты в папку tests рядом c src. В таком случае импортить имена надо будет через use {crate_name}::...; но в таком случае надо иметь lib.rs или эквивалент, который будет экспортировать модули наружу через pub mod;Но вообще я ещё ни разу так тесты не отделял, предпочитаю писать их рядом, через #[cfg(test)]mod tests { use super::*;...}Вообще, насколько я понимаю, твоя проблема в том, что ты не включаешь тесты в зону видимости, тебе надо указать все модули, которые ты используешь, в lib.rs. Например, когда у тебя не находится types.rs, который вроде бы как рядом, это потому что ты не указал его в lib.rs. Чтобы было понятнее, представь lib.rs корнем дерева, из которого исходят модули-ветки, из которых тоже могут идти ветки.Допустим, есть lib.rs, в котором есть pub mod module;pub mod module2;Поскольку ты их указал в lib.rs, ты можешь импортировать имена в модулях module и module2 через use super::module::{...};use super::module2::{...};или use crate_name::module(2)::{...};Поскольку модули являются дочерними сущностями относительно корневого lib.rs, именно поэтому в lib.rs надо указывать все модули, которые собираешься использовать(а если не хочешь включать модули с тестами, используй #[cfg(test)] перед pub mod test_1;.)Та же ситуация с mod.rs, в нем ты должен указать дочерние модули, если они у тебя есть.Сорри за форматирование.
Аноны, что нового, как сами-то вообще? Я вот тут взялся один известный опенсорсный проект с сей на раст переписывать. Конвертилок кроме c2rust не нашёл, но она делает лютый пиздец - сишный код на расте, который к идиоматичному привести сложнее, чем собсно сишный. Поэтому сижу и тупо переписываю, строчка за строчку, изредка с ватозаменой, вродеsed -i -E 's/(unsigned int )([_a-z]*)/\2: usize/g' src/file.rsдумаю, это будет бриллиант в моём портфолио. Все просто охуеют, да я и сам охуею, если получится. Но пока я это конпелятору даже не пытаюсь скармливать, сперва перепишу грубо и грязно, потом перепроверю, а потом буду функцию за функцией вытягивать и обмазывать тестами.а что у вас?
>>1413059> Я вот тут взялся один известный опенсорсный проект с сей на раст переписывать. Нахуя тебе этот бриллиант? Либа уже есть, нахуя делать всё то же самое, только на расте? Напиши лучше свой собственный, оригинальный бриллиант.
>>1413098Оче просто. Либа:- хорошо отлажена в плане алгоритмов- раскручена и на слуху- до сих пор одна из лучших в своём классе- значительно не обновлялась лет 7, а мне хотелось бы от неё пару новых фич, которые стрёмно реализовать на сях.
>>1413098> нахуя делать всё то же самое, только на растеПотому что могут.https://github.com/remacs/remacs
>>1414638Да забей, смысл отвечать этому шизику. Он же тут по всему треду устраивает театр одного семена, "гыгыгы работы нет". Ну хоть тред бампает, и то неплохо.>>1413724Сам тут взялся разбираться, и понял что нихуя нормального нет. Чо сам пытался осилить:https://rust-lang.github.io/async-book/ (но там пиздец нихуя не написано, может в версии с гитхаба побольше)https://tokio.rs/docs/futures/basic/https://dev.to/mindflavor/rust-futures-an-uneducated-short-and-hopefully-not-boring-tutorial---part-1-3k3 (не нашел полезным)Просто попробуй сам заимплементить какую-нибудь футуру для начала, потом стрим. Я в какой-то момент заступорился, но вот этот пост помог мне больше, чем все гайды вместе взятые: https://www.reddit.com/r/rust/comments/84y1n1/how_to_implement_the_poll_method_for_the_future/dvu6s2n?utm_source=share&utm_medium=web2x
>>1414786Кстати да, исходники очень помогают. Еще стоит посмотреть в код либ, где заимплеменчены асинхронные фичи, я вот копался в reqwest::async и hyper.
>>1414734>>1414786async-book это же про нативный async/await, а не про фьючеры, которые futures = "0.1". разве не так?или они смерджили тот крейт себе в std?вообще спасибо за ссылки. исходники - это хорошо, но пока мне сложна в растосорсах копаться с евойными impl for, хотя не отменяет того факта, что надо)
Тыкните куда читать, пожалуйста. Пусть есть структура, в ней Option<Box<что-нибудь>>. Как вытащить из неё собственно Box и записать в Оption нуль? Ну, то есть: if (t.ptr != 0){Ptr p = t.ptr; t.ptr = 0}. Я нуфаг совсем, спасибо.
Аноны, а есть деревья, но так, чтоб без боли?Нашёл https://saschagrunert.github.io/indextree/indextree/index.htmlно он какой-то корявый.. Может есть получше?
>>1416636Рекурсивно делить изображение на квадраты. У каждой ноды будут записаны- координаты начала- координаты конца- Option(родитель)- Option(вектор с детками)ну и будет метод gen_children для генерирования деток - внутри координат self выделяем от 4х квадратов и пишем ей в childrenПытался сделать на Rc и лайфтаймах - охуел с того, сколько подводных камней вылазит. А так, хочу, чтобы можно было> let mut root = Node::new(0, 0, h, w);> root.gen_children();> for child in root.children.iter() {> if child.wants_children() {> child.gen_children();> }> }
>>1416736А зачем ноде нужно знать родителя? Если такое требование убрать, то можно сделать так:struct Node {range : [[usize; 2]; 2],children : Vec<Box<Node>>}Если родитель таки нужен, то добавляй указатель и ебашь через ансейф, главное следи, чтобы твой интерфейс не позволял элиасинга.
>>1416749Родитель очень нужен, там делается сравнение свойств изображения в дополнительных полях. Ансейф можно попробовать, конечно. А что, конпелятор сам ну никак не отследит, что я не делаю ничего плохого?Например, такая частая ругань:> cannot borrow `tree` as immutable because it is also borrowed as mutableЭто было при попытке чтения структуры, после root.gen_children();Но, ёпта, конпелятор же должен видеть, что > it is also borrowed as mutableсделано выше в однопотоке и уже давно завершилось, чилдрены сгенерились, все свободны. Ну нет, мы будем якобы думать, что я там в ниебацца какой поток это передал и оно до сих пор что-то там пыхтит мутабельно и асинхронно.
Крабики, какие есть нормальные либы для обработки видео\изображений на ржавом? Нашёл биндинги под opencv и ffmpeg, в которых я более-менее разбираюсь, но ни один крейт у меня не компилится и жалуется на заголовки файлов, которые уже не поставляются с ffmpeg давно. Единственное осталось из известного ещё - это gstreamer, но там хуй проссышь, что как работает. Все эти бины-пайплайны-синки что-то нет желания прокуривать. Задача вообще простая - нужно задекодить видео, считывать по кадру в буффер и дальше как картинку по пикселям смотреть. Как это зделоть в расте? И не надо меня в сишку посылать, там то всё без проблем будет, а мне именно раст потыкать охота
>>1416915https://crates.io/crates/y4mТам есть примерffmpeg -i in.mkv -f yuv4mpegpipe - | target/release/examples/resize - 640x360 - | mpv -Вот этот resize тебе и нужен - таки это тоже прокуривание пайпа, но ничего проще не придумаешь.
>>1416775https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=ae624ce87bcfba81f07f36ee0ebffd8dтам есть закомменченый кусок кода, который не работает - получение деток изнутри ноды. А снаружи, сцук, работает. Хотя, казалось бы - тот же вектор, Arc+лочка на месте, но чего-то не хватает.
>>1416949Поправил, но выглядит как пиздец, лол. 1. Arc подыхал на той же строчке, в которой клонировался, в результате и по локу к нему было нельзя обратиться. Сделал биндинг для клонированного Арка и уже его лочу.2. Сделал дерайв Clone для OffNode и кладу n.clone() в вектор.3. При итерации сделал n вместо &n, не хватает знаний нормально объяснить, в чем разница. https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=422a78da56f88ab7c3e215d6e4faad2bЧто это должен быть за алгоритм, наверняка есть нормальный способ его написать?
>>1416966> n.clone()блин, не то, как мне для самой-то n деток генерить? Вообще, заметил нехватку такой вещи: Rust запрещает mut во много потому, что это подразумевает возможность деструктивных действий типа удаления. Например, храню я ноды в векторе, надо что-то сделать:1. вынимаю дочку из вектора2. передаю вектор дочке, чтобы она напихала себе в него ещё дочек.конпелятор такой:вай-вай, щито ты делаешь, а вдруг дочка удалит родителя?а я ему: мамой кланус, не удалит!а он мне: на си будэшь класться, а пока иди домой!дак вот, может есть промежуточный вариант, когда мы одалживаем вектор мутабельно, но с запретом на удаление, только для добавления? Костыльно я мог бы и сам это сделать так:получить от дочки вектор с её детками и разложить его самостоятельно. Но эт как-то жопно.
>>1417969пердолься с трейтами, заверни вектор во враппер, который будет имплементить Delete и Insert. там где нужно возвращай impl Delete/Insert. interface segregation типа
>>1418005Мысль хорошая, но боюсь, что не взлетит. Лан, попробую, потом всем тредом подумаем, прав конпелятор или нет.
>>1418109честно говоря, я не понимаю твоей мыслиесли тебе нужно мутировать объект, ты передаешь &mut X или mut X. причем, где принципиальная разница в качестве мутации между добавлением данных в структуру или удалении их оттуда? почему элементарная перестановка значений в векторе менее деструктивная операция, чем удаление какого-либо элемента?мы говорим не о бизнес-логике в целом, а о представлении компилятора на происходящее офк
спасите от лайфтайм-чекера. я правильно понимаю, что anonymous lifetime имеет &self и что компилятор сильно переживает, мол, инстанс, которому вызывают send_message может не пережить сам метод?если так, то какой выход из этого всего? &'static self компилятор тоже заворачивает лол, да и это понятно
>>1418252и тут я посмотреть на своё кодэ и понял, что все очень-очень плохолучше ли будет возвращать Future из send_message, а место отправки сообщения обернуть через tokio::spawn? но тогда, суда по всему, для T нужно добавить будет констрейнт Send?
Чё за хуйня с cargo? Зачем он копирует все зависимости в /target? У него же есть уже папка .cargo. Я вот раньше что-то не замечал, а тут решил посмотреть, чего у меня место на диске заканчивается, а у меня в каждом растопроекте по 1-1.5гб зависимостей. Мы теперь, как нода чтоле?
>>1418485Ну не теперь, а давно уже, и во-вторых, да, артефакты в target могут быть очень разными, в первую очередь из-за возможных комбинаций фич и статической линковки, в .cargo наверное только сорцы и складываются. Ну и cargo не чистит старые билды, так что будет все печально если не следить за папкой. Надеюсь, скоро начнут пилить что-то по этой теме.
Анон с деревьями репортин ин.С гордостью рад представить вам получившуюся мега-ебалу (зато идиоматичную!): https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=d2390925f3cafc95ddcf1b94243006e6Для каждого уровня вложения используем отдельный вектор - так на спуске по дереву не возникает пересечений. Пиздеца там наворочено много, конеш, подозреваю даже, что можно обойтись без RefCell и одного Arc - надо будет попробовать почистить.
Аноны, нужен аналог питоновского fifo Queue. Чтобы несколько тредов писало в очередь с локами и несколько тредов читало. Стандартные каналы не катят. В доках ничего не нашел. Есть готовый крейт?
>>1423452Оберни во что-нить. В Mutex, например. Или тебе надо, чтобы прочитали одно и то же несколько раз?
>>1423234Ну если ты просто let сделал, то почему ему не плеваться на тебя? Сделай clone(), если возможно. Вынеси self.address иначе. Что ты, блять, как маленький? И где ты let сделал, на каком уровне вложенности?
>>1423452> mpsc> Multi-producer, single-consumer FIFO queue communication primitives.Ты долбаеб, что у тебя не катят?Или давай семантику локов определяй
>>1423712Ну дык, ты в в этом замыкании захватываешь self и потом его возвращаешь, когда возвращаешь футуру (что собственно неправильно, ведь футура может существовать дольше твоего объекта). Сделай .clone() на self.channel_name (у тебя же там String, да?), как говорил анон >>1423660 выше, должно быть ок.
>>1426846в C# анонсировали завоз оператора _, расширение switch-а до уровня похожего на растофункциональщину, деконструкцию (правда, уебищную). как обычно, каждый язык берет что-то удачное из другого и начинает имплементить это у себя. выглядит так себе, мягко говоря
>>1426846>>1426850Что вам не нравится, петушки? Вы хотите до сих пор писать на Java 1.6 с анонимными классами вместо лямбд?
>>1426850Благодаря твоим картиночкам всем становится понятно, почему у тебя так болит жопа.Никто ведь не обещал, что ебать в жопу будешь ты, а не тебя.
>>1427322Я нихуя не понял из того, что ты написал. Про какую-то хуйню, кого-то ебать в жопу, у кого-то болит жопа, просто охуеть.Но у меня сложилось впечатление, что ты думаешь, будто я пишу на этом блядоязыке для телевизоров. Уверяю тебя - ты ошибаешься.Однако, думаю, что тебе стоит обратиться за профессиональной помощью с твоей анальной фиксацией.
ИМХО, если вы знаете си, то растбук можно не читать. В книге от О'Райли все описано более структурировано и понятнее. Вас не знакомят с языком, говоря "почитайте потом документацию", а сразу рассказывают как все устроено.
>>1430115Ну хз. Типа есть "Rust by Example", фактически от разработчиков, очень похож на О'Райли, но Rust by Exampler лучше структурирован и не устарел морально (ибо фиксится периодически). Так что лучше прочитать Rust by Example уж тогда, держа под рукой растбук на случай непоняток.
>>1437789Хуй знает, попалось на реддитеhttps://www.reddit.com/r/rust/comments/ceevlw/i_am_really_disappointed_in_rust_community_for/
>>1437869Ага, щас. Большинство только пиздеть горазды, а как что-то сделать, так хуй там.>>1437849Альтернативы 10/10:> GothamПараша, которая компилируется только на nightly> Все остальноеСырая неюзабельная хуйня без коммьюнити.
Здравствуейте, аноны. Объясните, пожалуйста, как мне реализовать "+=" для i8 и u16, а так же для всего подобного? Куда смотреть? Был бы рад конкретному примеру. Пробовал втупую реализовать "AddAssign<i8> for u16", но не вышло ничего.
>>1438501Видимо, нельзя.https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=c10fb4d3fd86d59627bf5b38e984166cДелай явное преобразование типов.
>>1438516Теперь всё ебало в кастах. Ну, чтож, спасибо и на этом.С одной стороны явное преобразование всё же лучше неявного, но с другой стороны код получается уродским.
Аноны, как же так? Тупла, это же просто набор отдельных переменных - почему бы конпелятору не посмотреть, что там унутре, и, если там одни примитивы, не сконвертить?Я, конечно, вона в какие замыкания могу, но некрасиво же.
>>1438546Если реально дохуя кастов выходит, то можешь сделать newtype и для него уже реализовать то что тебе нужно. Из твоего скрина не очень ясно откуда какие числа берутся, но self.pc ты точно можешь завернуть в newtype и реализовать для него ужные действия. Еще не забудь накинуть на свой новый тип #[derive(Copy)], и выйдет вполне няшно, ну и Display возможно тебе еще придется реализовать элементарный (если много таких типов будет, то есть хороший крейт newtype_derive + macro_attr. Еще из плюсов такого подхода выйдет compile-time проверки типов передаваемых в функции (не знаю нужно-ли тебе это, но точно лишним не будет).
Аноны, а есть тут знатоки вулкана? Я тип пытаюсь в него, используя vulkano. Решил натянуть ужа на ежа, сову на глобус, текстуру на произвольный четырёхугольник (за основу взят image из примеров). Получилось. Но для этого пришлось ковырять шейдер, чтобы промапать конкретные координаты конкретного прямоугольника.Что-то мне подсказывает, что можно лучше, но из коробки вулкан предлагает только обрезку и повтор. Ведь прямоугольников будет много, они будут морфировать, не переконпелять же шейдер каждый раз.
>>1438816Они у меня и так есть, толку-то. Мне нужно натянуть квадратную текстуру на условную трапецию.Вот так я сделал это на растеhttps://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=8ad2240a8e2dedf850c7a988a837d6ffтолько внешнюю область не отсёк, ну и так всё понятно
Ну до чего ленивый анон пошёл, а. Я вот сча сам нагуглил, что есть такие геометрические шейдеры - скорее всего они-то мне и нужны. Сперва натянуть текстуру на квадрат, а уж потом менять форму.
>>1439104Т.е. ты начал спрашивать до того, как загуглил? Если бы не наша приверженность Code of Conduct, тебя бы уже покрыли хуями.
>>1439331Я гуглил, потом спросил, потом ещё погуглил. И да, я таки до сих пор не уверен, что это то, что мне нужно.
>>1439627Я так и не понял, почему тебе в массив вертексов не ложить сразу трапецию, и вот на неё уже натягивать текстуру. И это даже необязательно делать в шейдере. Ужас-ужас, придется использовать математику, но что поделать.
>>1439784>сразу трапецию, и вот на неё уже натягивать текстуруДак о том и вопрос - как? Шейдером с математикой я уже натянул, вот только это штучное неоптимальное решение.
Сап, господа растаманы. Решил попробовать вкатиться, потихоньку осиливаю. Столкнулся со следующей проблемой - выразительные и вообще все из себя охуительные Enum в ржавчине не могут даже того, что можно было сделать в C. Суть:1) По сети программе прилетают пакеты.2) Каждый пакет промаркирован некоторым тегом.3) Тегов 100500 x 9000 x 1337 разных штук и могут появляться новые, программу из этого разнообразия интересуют всего 20-30 идущих не по порядку (сначала 42, потом 146, потом 228 и т.п.).4) Что хотел сделать я: загнать эти 20-30 тегов в Enum и сделать match по значению с дефолтным вариантом. В C было бы примерно так же.5) Что выяснилось: в Rust так сделать нельзя. Начиная с того, что нет нормального способа сконвертить u32 в Enum. Есть std::mem::transmute, но программа будет падать, если значение не попадает на одно из описанных в Enum. Описать Enum со всеми значениями не представляется возможным чисто практически. Описать Enum с условно "дефолтным вариантом" типа Other(u32) не позволяет уже компилятор - discriminator values can only be used with a field-less enum. Каким-либо здравым образом проверить принадлежность значения Enum перед конвертацией чтобы реализовать метод типа from(u32) -> Option(Enum) тоже нельзя (можно просто создать новый массив, где перечислить все значения Enum as u32 - а если появится новое, его что, вручную вносить в два места?).Можно не преобразовывать полученный u32 тэг в Enum, но тогда либо match превращается в ужасное говно вида "x if x == Enum::SomeValue => ...", либо вообще придется отказаться от Enum и в match засунуть цифровые значения тегов, подписав их в комментариях.ЧЗХ, посоны? Почему Rust не может просто и красиво сделать то, над чем в C даже думать не приходилось?
>>1441724> ЧЗХ, посоны? Почему Rust не может просто и красиво сделать то, над чем в C даже думать не приходилось? Потому что ты криворукий шизофреник (твой бред ОЧЕНЬ сложно читать).> нет нормального способа сконвертить u32 в Enum> реализовать метод типа from(u32) -> Option(Enum) тоже нельзяhttps://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=1e7ed7ab02a98a7c783877330380e177Единственная проблема, которую я смог (вроде правильно) понять из твоего текста.> даже думать не приходилосьНу да, хуяк-хуяк и сегфолт. Тут так нельзя.
>>1441731Документацию я облизал вдоль и поперек, от книжки до by examples и nomicon. Нигде не нашел решения.>>1442155>Потому что ты криворукий шизофреник (твой бред ОЧЕНЬ сложно читать).Спасибо на добром слове, я тоже тебя люблю. Описал все максимально кратко и понятно, может быть, несколько эмоционально.>Единственная проблема, которую я смог (вроде правильно) понять из твоего текста.Я в тексте же и описал ее потенциальное решение. Ну да, можно сделать и так, как ты написал. Но у меня этих значений не 2, а 20-30, причем они могут добавиться в перспективе. Это все в match пихать? Не говоря уже о дублировании информации.>Ну да, хуяк-хуяк и сегфолт. Тут так нельзя.В том и дело, что сегфолт как раз можно (при помощи unsafe, правда - transmute), а вот сделать Enum, у которого часть значений была бы описана явно константами, а часть явно или неявно (как в C) опускалась - невозможно даже с помощью unsafe.Вот тебе пример того, что я пытаюсь сделать (на плюсах, правда, не на C, но это мелочи):http://cpp.sh/6jlnhКак такую же простую, примитивную и встречающуюся на каждом шагу штуку завернуть в расте?
>>1442414Впрочем, кажется, я уже подобрал решение. Не очень красивое, но, по крайней мере, без особых проблем. Associated constants спасут отца русской демократии. Если есть вариант интереснее - буду рад услышать.
>>1442414https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f6b8ca493806e3bf4e7b11a26ce230b9пизжено отсюда https://www.enodev.fr/posts/rusticity-convert-an-integer-to-an-enum.html
>>1442460Спасибо, принимается. Я не нашел, плохо искал, видимо.// Хотя я все равно недоволен тем, что такие простые и базовые для любого системного языка вещи приходится костылить через левые пакеты. И ох если бы это был единственный пример... Весь Rust из такого состоит.
>>1442481А ты перестань мыслить сишными категориями и всё пройдёт. Зато теперь ты можешь любой набор байт превратить в этот Option<EnumType> и не потеряться по коду, что он и зачем. Это гораздо лучше, чем таскать число, постоянно держа в уме, что вот оно вроде число, но тут мы ещё проверим его на соответствие возможным значениям EnumType, поэтому это как-бы EnumType, но как-бы и не он.
>>1442414>а вот сделать Enum, у которого часть значений была бы описана явно константами, а часть явно или неявно (как в C) опускалась - невозможно даже с помощью unsafe.Тогда это вообще не енум, а хрень какая-то, тебе проще сделать 20 именованных констант в неймспейсе и матчить с интами. Более того, так даже в Си часто делают.
Java-бог в треде. Ну ка объясните мне нахуя мне нужен раст, если в моем языка дохуя уже написано просто бери и соединяй.
>>14433671. 90% либ на жабе - костыли, нужные, чтобы хоть как-то этим говном без слёз пользоваться.2. 100% либ на жабе - тормозное говно, ибо иначе на жабе никак3. добровольно пишущих на жабе опенсорс just for fun почти нет. Опенсорс проекты на жабе, это либо под ведроид, где выбора нет, либо корпоративная отрыжка в апачеотстойнике.так что, ты не бог, то просто макака, которой белые господа за банан поручили написать реализацию интерфейсов. В этом вся суть жабы: в разделении на господ и макак, что очень удобно для менеджмента.
>>14437561. Сахарный из коробки. Итераторы, вывод на печать чего угодно, автовыведение типов, туплы. Сахарность почти как у питона, сам с него пересел. Сравни с жабой, где для каждой мелочи на stackoverflow предлагают городить костыльный класс на пару экранов.2. Быстрый и нативный. Жаба в этом сливает даже питону, у которого каждая третья либа пишется с использованием cython или c.3. Строгость и многообразие типов. Есть даже беззнаковые целые, прикинь.4. Есть борроу-чекер. Конпелятор сам следит за тем, чтобы ты, мудила, не устроил data-race. Жабе тут вообще похуй - хочешь, используй атомики и мьютексы, а хочешь - нет и получай андефайнд бехэйвор.лучшее, что может случиться с жабой - если её языковые возможности подтянут до раста. switch, вон, делают, знаковые собираются завезти. Т.е., чисто в теории, если пофантазировать, что они в 1000 раз ускорят её развитие, то по удобству она будет на уровне раста. Но, сцук, по скорости и потреблению ресурсов - как сосала, так и будет сосать. А по факту сосёт по всем параметрам, даже не знаю, что может заставить кого-то писать на ней, кроме большого бабла.
Как в растишке с сокетами работать? Есть какие-нибудь бест практис? Пытаюсь тут проксю написать, но io::copy на входной и выходной стримы мне тупо поток блочит, пока сокет не закроется. Как я понял, потому что eof не приходит. Как тогда вообще проверять, хочет ли сокет читать-писать? Нихуя не понимаю
>>1447816Если ты работаешь с чем-то типа TcpStream, можно попробовать установить set_read_timeout. Если что-то другое, реализующее Read, то наверно читать маленькими буферами и копировать байты куда надо. Можно еще попробовать поиграться с асинхронщиной через AsyncRead.А вообще если ты сидишь на юниксе и просто копируешь байты из А в Б, мне кажется, что проще просто работать с сырыми дескрипотрами и через dup2 (https://docs.rs/nix/0.14.1/nix/unistd/fn.dup2.html) перенаправить куда надо.
Аноны, а могу я в макрос передать вызов функции так, чтобы вызов был осуществлён из макроса? Ну, тип, чтобы в макросе добавить к ней какой-нить длинный префикс или добавить к вызову пару параметров.
>>1450505Нашёл, нужнo передать как stmtmacro_rules! unsafe_and_check {( $expr:stmt ) => ( let status = unsafe { $expr };assert_eq!(status, OK);)}теперь другой вопрос - можно ли вывести на печать стейтмент?
>>1450570>stringify!Воу, пасибо тебе, братишка. Получился такой макрос для вызова сишных хункций с возвратом статуса, будь они неладны.macro_rules! unsafe_and_check {( $stmt:stmt ) => ( let status = unsafe { $stmt }; assert_eq!(status, OK, "Got status '{:?}' when call {:?}", status, stringify!($stmt)););}
golang начали разрабатывать в 2007 году, а rust - в 2006 году, версия go 1.0 вышла в 2012 году, а rust 1.0 - в 2015 годуПочему rust до сих пор не взлетел? В то время как go уже стал стабильной частью ынтырпрайза.
>>1454962Потому что Go это про быстренько запилить очередной REST API. А Rust это про системное программирование, которым занимается не так много народу.