Это копия, сохраненная 5 июня 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
https://www.rust-lang.org/
Обязательно для прочтения: https://doc.rust-lang.ru/book/
Вместо шапки: https://gist.github.com/TatriX/183c816f1346d418f969c4576c2b9b41
Ресурсы на русском: https://rust-lang.ru/
Предыдущий тред: >>1789061 (OP)
Ты хочешь склонировать динамический объект. В расте из коробки нельзя так сделать, нужна либа:
https://docs.rs/dyn-clone/1.0.3/dyn_clone/
Спасибо большое
Строки это фундаментальный тип. Просрав его, в каком-нибудь вебе, начинается бесконечная пляска конвертаций.
Но мы не в вебе, и разница между иммутабельной строкой c известном размером, и контейнером с динамически аллоцируемой хуйней есть.
И нельзя от неё избавиться, потому что изобретут что-то своё костыльное
Нет ты.
А go тебе не смущает? Или c? Пишешь rustlang в поисковом запросе и нет проблем.
>Но мы не в вебе
Еще один узко-велосипедный язык, ну нафига?
>разница между иммутабельной строкой c известном размером, и контейнером с динамически аллоцируемой хуйней есть
Давно уже придумали решение неизменяемых строк и отдельных билдеров. Я еще уверен что не бесплатно стоит пройтись по utf-8 символов за аскии.
Как мне смапить на 264 строчке option так, чтобы тип соответствовал возвращаемому типу функции, нихуя понять не могу? Нужен Option<Box<dyn Expression>>, а выходит только Option<&Box<dyn Expression>>.
Ну и раз уж на то пошло, почитай https://doc.rust-lang.org/stable/std/fmt/trait.Display.html
В том что нафиг такой билдер нужен. Нужна нормальная строка, чтобы я с юникод мог взять первый или последний символ по человечески, а не только аскии, чтобы не конвертить туда сюда, потому что авторам пригрелся слайс.
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fc0067f7159768f607c079bd618bc056
Авторам пригрелось тебе показать, что строки это сложно. И получать последний символ ни капли не o(1).
Строго говоря, в каноничном UTF-8 таки O(1), потому что границы чаров точно определяемы, просто там чуть сложнее индексовой операции.
>>1882545
Нет. В UTF-8 у чаров переменный размер от одного до четырёх байтов, но чары кроме аскии на хуй не нужны никому, потому что в любых языках с умлаутами или ещё какой-нибудь дрянью, одна и та же буква может быть как одним чаром, так и не одним чаром, но их надо обрабатывать как одну и ту же букву. Короче, строки кроме аскии это такая ебля, что ты охуеешь, если в эту нору полезешь.
Да, чтобы меня не захейтили за O(1), уточню, что это только последний чар в строке, N-ый чар в строке найти только за O(n), разумеется.
Лол, ну ты и выдал. То есть пол миллиарда европейцев идут нахуй, китайцы идут нахуй, арабы идут нахуй, русские идут нахуй. Все идут нахуй, кроме американцев и прочих британцев, и то при условии что они не пользуются смайликами.
Строки это не сложно когда это последовательность (список) в utf-16 (в два и четыре байта).
Проще пилить на слайсы, всё остальное в них так же сложно
Тем что не C++
Модули завезли? А человеческие sum types?
Тем, что все унижения на этапе компиляции, а не на проде субботней ночью.
И что мы там например видим: https://docs.rs/im/15.0.0/im/struct.Vector.html#method.push_front
push_front мутирует вектор, а не, как я ожидал, создает новый вектор с добавленным элементом. Другие методы вектора все тоже мутирующие. А где иммутабельность-то? Или я что-то не понимаю?
Скорей всего где-то глубоко запрятан copy-on-write.
Попробуй вывести адрес такого вектора до пуша и после
ну блин, херня какая-то, почему вообще в языке, в котором по дефолту всё иммутабельное, коллекции полностью мутабельные? где нормальные иммутабельные коллекции-то взять?
Вот именно что коллекции по дефолту иммутабельные. Не веришь - попробуй мутировать vec, объявленный без mut. Система типов просто не позволит тебе получить мутабельную ссылку на внутренности контейнера через иммутабельную.
А зачем все переменные по дефолту иммутабельны? Ровно во за этим. Раз уж делается в языке упор на иммутабельность, то и добавили бы для коллекций иммутабельные операции. А так получается коллекции без mut практически бесполезные, с ними ничего толком не сделать. Это как если бы у целочисленных переменные убрать оператор + и оставить только +=. Та же самая картина была бы
ты сейчас про систему типов говоришь, а я про предоставляемые коллекциями операции, которые все мутабельные
Ты попутал с кложурой или хаскелом. Упор делает не на иммутабельность, а на контроль над тем кто может мутировать данные, а кто нет. И за отслеживанием того, кто и когда владеет объектом. И конечно же перформанс.
>
>Упор делает не на иммутабельность, а на контроль над тем кто может мутировать данные, а кто нет.
Ок, допустим, зачем тогда по дефолту делать все переменные иммутабельные?
Потому что есть опыт с++, где все переменные по дефолту мутабельные и когда народ догнал что большая часть данных как раз таки не должна меняться, оно превратилось в const foo(const) const. Короче, по дефолту ты получаешь минимум возможностей, но если тебе прям точно нужна мутабельность, ты можешь ее попросить.
у меня единственный вариант, что что-то для локалей, потому что явно не итераторами настолько раздули std
By default, Rust optimizes for execution speed rather than binary size, since for the vast majority of applications this is ideal. But for situations where a developer wants to optimize for binary size instead, Rust provides mechanisms to accomplish this.
Отклеилось.
молодец, сам понял, что принес? Как выкинуть одну и заменить другой или просто не использовать.
Ряяяяяяя!
>Почему у раста либа такая большая ~3.5mb, что туда понапихали? даже у плюсов в два раза меньше
Да ты охуел? У плюсов она в 50 килобайт поместится
Разве плюсы не всегда славились тем что у них в стандартной либе почти нихуя нету?
файловыую систему в 17 завезли? треды в 11?
А, понял. Нет, этого в стандартной либе нет и, скорее всего, не будет. Кмк, это связано методом управления памятью - без сборщика мусора трудно переиспользовать старые значения, а значит, хардкорная функциональщина будет тормозить за счет постоянного выделения-освобождения памяти. Крейт im и тому подобные в помощь.
Возьми cargo-bloat и посмотри, что понапихали. Я вот посмотрел и увидел, что даже без извращений с размером кода всё ок.
У хеллоуворлда (280КиБ) - https://pastebin.com/7q1f53gZ - большая часть жира из-за обработчика крашей, он тянет за собой печать бэктрейса и полный набор форматтеров текста. Сейчас в расте что-то сломали и убрать его нельзя.
Кроме того, если уж сравниваешь раст с плюсами, то не забывай, что у плюсов стандартная библиотека обычно линкуется динамически. Включишь статическую линковку - плюсы выдадут тебе 1,8МиБ отборного говна - https://pastebin.com/cYCt8rvN. Даже чистый C сейчас выдает по 700КиБ кода.
Кмк, ни то, ни другое сейчас не важно. Вот Swift for linux, который тебе из ничего сделает 30МБ бинарник - это пиздец.
Если и следует о чем-то беспокоиться, так это о скорости сборки - с ней всё плохо :(
>>1885188
> Да ты охуел? У плюсов она в 50 килобайт поместится
у плюсов 1-1,5mb в зависимости от платформы: на ведроиде ~1, на винде ~1,5
>>1885211
я же не в том ключе сравниваю. Я лишь хотел узнать, что там раздуло либу до 3,5 и нельзя ли отключать ненужные в проекте часте, а не так, что отрубать прямо все и сразу типа no_std
просто подумал, что может там модульная структура и можно не тянуть все, а только нужные модули
Ну я и пишу - не гадай, а сразу взвесь жир при помощи cargo-bloat. Ненужные части и так не должны попадать в код - они удаляются при включенном lto (обработчик крашей - редкое исключение).
Man, do I look to you like I know what am I doing?
Можешь еще написать ему LGBT
Ядер 8/16, пробрасывал ему RAYON_NUM_THREADS=12, выставлял через rayon::ThreadPoolBuilder::new().num_threads(12).build_global().unwrap() - ничего не помогает.
Хз, надо тестовый крейт замутить. Вообще, работает нон параллельно, но в одном потоке - как будто rayon с какого-то перепугу решил заюзать треды от tokio.
>>1896610
Ёпта, и правда, дело было в асинхронности. Унёс все асинхронные функции вообще в отдельный бинарь (там из асинхронного было только обращение к сети за данными, которые, один хер, кешировались).
И теперь совсем другое дело, все ядра в работе.
Ну, это подстава, пиздос. По-хорошему надо бы разобраться, сделать тестовый сэмпл, и багулю зарепортить, а мне лень.
Бля, у меня, походу, очень сложный кейс. Эта самая rayon'ная многопоточность запускается в цикле, дак вот: на первой итерации все 8/16 забиты под завязку, но на последующих - вроде бы и куча потоков реально запущена (top -H их отображает), но при этом все они прибиты к одному ядру (спасибо, что не к логическому). Хоть 12 потоков, хоть 32 - одинаково.
Не знаю какую ты проблему пытаешься решить.
Синтаксис лямбд очень лаконичный:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2015&gist=038ab64bdf89d2fbfcb49972314cbe31
Не завезли, пиши лямбды руками.
Можно сделать на макросах
https://peppe.rs/posts/auto-currying_rust_functions/
Отчасти понятно почему каррирования как в хачкеле нет, пришлось бы Self шатать
Нет чёткой картины, но систему типов Rust придется переебашивать, и Self перестанет быть простым типом
- Ты функциональщик! - прокричал Сергей на весь оупен-спейс-рум номер 14. Комната притихла в ожидании развязки. — Я видел, как ты вчера вечером каррировал и декаррировал прямо за рабочим компьютером! Неодобрительный ропот и возгласы удивления прокатились по комнате. Кто-то громким шепотом сказал “какой ужас, а я с ним за руку здоровался”. — Знаешь что, Сергей, — сказал Денис, вставая из-за рабочего стола, — любой нормальный мужчина, если у него всё в порядке, может позволить себе позаниматься функциональным программированием. Это естественно. Каждый хотя бы раз, да пробовал. Зачем только об этом кричать на всю комнату? Я же не кричу, что ты объектно-ориентированный! Девушки захихикали, кто-то снова громко пробормотал “ну надо же, а по нему и не скажешь”. Присутствовавший при этом Игорь Матвеевич сильнее вжался в кресло. Только бы никто не узнал про его процедурные наклонности!
Лучше действительно бесплатными абстрациями, а не бесконечными боксами. Хуже отсутствием HKT, которых не будет ещё как минимум десять лет.
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=220e6d4f6d95424c9b24f8e086ab2893
>и вообще у тебя as_bytes() возвращает &[u8], а не &[&u8]
тогда почему мне приходится a разименовать? иначе получаю для кода
[a, b, ..] if a == b + 1 => false,
ошибку error[E0277]: can't compare `&u8` with `u8`
жесть, а как так-то? что это вообще? как-то контр-интуитивно. Что почитать-то про это?
> как-то контр-интуитивно
> as_bytes() возвращает &[u8]
&[3, 4, 5, ..] помоему вполне интуитивно
А чё можно написать на ржавом?
поясни
Почему айтишники такое быдло?
Можно описать полноценные функторы.
Обходимся тем что дали - Iterator, но это ограниченное решение
мимоанон
Из-за этого вместо того, чтобы переиспользовать значение аргумента приходится создавать новое.
т.е. вместо скажем вместо
fn predicate_good( mut s: String) -> String
{
s.push( '1' );
s
}
приходится писать че-нить типа:
fn predicate_bad( s: &String ) -> String
{
let mut ss = s.clone();
ss.push( '1' );
ss
}
Как мне избавиться от клонирования здесь?
В std::iter::Iterator такой хуйни нет и аргументы всех предикатов передаются по значению.
там аналогичной функциональности нет.
В принципе у меня скорее вопрос философский архитектурный, какими соображениями создатели itertools руководствовались когда так сделали? Херня ж по-моему какая-то получилась, или я что-то упускаю?
> там аналогичной функциональности нет.
А их нельзя смешивать разве?
> To extend Iterator with methods in this crate, import the Itertools trait:
> use itertools::Itertools;
https://doc.rust-lang.org/std/iter/fn.successors.html
И там тож аргумент предиката по ссылке - F: FnMut(&T) -> Option<T>
Почему, йопта?
Для передачи по значению есть map.
https://doc.rust-lang.org/src/core/iter/sources.rs.html#605
item возвращается как значение next().
Если бы функция принимала T, пришлось копировать значение.
Поэтому хотел бы задать пару вопросов:
1. Пишете ли вы на расте энтерпрайз бд, бизнес-логика и прочая залупа?
2. В каком состоянии гуй фреймворки?
3. Какова ваша средняя скорость написания кода на расте по сравнению с той же явой/дотнетом/etc?
4. Как вам тулинг по субъективным ощущениям?
Пишу без агрессии. Насчёт лаборанта не обессудьте, но когда пчел поднимает кластер EKS для базы в 250 мб с приростом 50 мб в год, и жалуется, что 32 Гб оперативки и 24 ядра пришлось потратить – это пушка
Забей, мёртвый игрушечный язык.
1 не по работе
2 плохо
3 лучше, но изредка может вылезти какой-нибудь заёб
4 заебца
> наверное, видели
Не. Пойду почитаю.
> EKS для базы в 250 мб с приростом 50 мб в год, и жалуется, что 32 Гб оперативки и 24 ядра пришлось потратить
Звучит как ошибка в ДНК которую никаким языком не исправить.
1. По работе
2. wasm збс, кроме готовых компонентов. Сервер збс
3. Скорость может быть меньше, но зато время дебага на порядок меньше.
4. rust-analyzer жрет гигабайты памяти, lsp днище, в целом терпимо
>3. Какова ваша средняя скорость написания кода на расте по сравнению с той же явой/дотнетом/etc?
>
Недавно ради интереса переписал один скрипт на Питоне, где много операций типа "достать строку из xml и преобразовать по шаблону". За исключением того, что изначальный скрипт написан психопатом, получилось довольно прикольно. И заработало с первого раза.
1. Писал блокчейн. Считается?
2. Есть биндинги к win api, gtk и другой залупе, свои фреймворки в зачаточном состоянии
3. От задачи и выбора инструментов зависит, так-то Rust абстракции выразительнее, но думать надо больше.
4. Компилятор хороший-удобный, всё остальное не очень
Моё мнение что всё это в принципе плохо ложится, неудобно писать на Rust GUI, по крайней мере с теми абстракциями что дали.
Но люди что-то пишут, что-то работает.
`let tcp = TcpStream::connect(&addr).unwrap();`
каким образом мне обработать ошибку резолва домена? Я в расте ни бум-бум.
С этим вроде разобрался, только непонятно где посмотреть тип ошибки если, например, хост недоступен. Подскажите, аноны!
Нихрена непонятно. Это не компилится
let tcp = TcpStream::connect(&addr);
if Ok(tcp) {
} else {
return;
};
Падажжи с этим, расскажите лучше про глобальные переменные. Как их, блять, объявить?
static
/home/user/.cargo/registry/src/github.com-1ecc6299db9ec823/block-buffer-0.7.3/src/lib.rsfailed to write whole buffer/home/user/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/io/mod.rsformatter errorfailed to fill whole buffer/home/user/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/io/impls.rsadvancing IoSlice beyond its length/home/user/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys/unix/io.rscalled `Result::unwrap()` on an `Err` value/home/user/.cargo/registry/src/github.com-1ecc6299db9ec823/yasna-0.3.2/src/writer/mod.rs/home/user/.cargo/registry/src/github.com-1ecc6299db9ec823/rdp-rs-0.1.0/src/nla/asn1.rsnegoTokenInvalid Cast/home/user/.cargo/registry/src/github.com-1ecc6299db9ec823/rdp-rs-0.1.0/src/core/gcc.rs
RUSTFLAGS='-C link-arg=-s -C panic=abort' cargo build --release и мусор остался.
А скажи что-нибудь на двачерском.
если ты опущ, неспособный понять принципы языка, это не значит, что язык говно
для начала, нахуя тебе глобальная переменная? в расте для этого юзается static с lazy_static / thread_local, шобэ было потокобезопасно
хочешь mut static - только через ансейф, ибо компиль не ебёт, будешь ли ты в будущем изменять глобальное состояние (что уже само по себе почти антипаттерн)
>понять принципы языка
Как это уебанство понять? https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=d4b3018117ac7c7a09314e53bb6ebb71
> error[E0133]: use of mutable static is unsafe and requires unsafe function or block
Тебе прямым текстом говорят что ты делаешь хуйню и что нужно сделать если ты сегодня первый день.
Я уже распарсил что нужно unsafe юзать. Создатели раста дебилы? Как без инкрементных операций циклы выполнять? Ебобо какое-то.
Какие циклы? Нахуя тебе для цикла глобальный мутабельный стейт?
1. Нет библиотек, хуевая инфраструктура
2. Дебильный менталитет у комьюнити, вечно все поломано и нихуя не работает
3. Хуевый компилятор, сборка проекта полдня
4. Слишком мало бабла инвестировано
5. Мало разработчиков
6. ???
7. Джава ЕЕ бой!
Чтобы что? Для энтерпрайза нужен максимально простой язык, которому можно обучить любого дебила, энтерпрайзу в целом похуй на перформанс и главное — сроки. Зачем там руст?
А как стартап относится к энтерпрайзу и к расту? Там же на жсе высирают всё как можно быстрее, лол.
Ну вдруг стартап в космической отрасли зарубежом для которой тебе придется иметь 100500 лет опыта, гражданство США/Европкосоюза, знание С++/АСМа/Верилога для галочки и прочие прелести за зарплату реакт-фронтэндера
Зумерок после гуманных языков испугался ады, кек.
Как мне такую же херню провернуть со структурой? Чтобы она была глобальная и мутабельная.
Сделать структуру по типу
struct Qwe(usize);
и заменить все "x = 42;" на "x = Qwe(42);".
Но вообще, ты ёбобо, которое потом будет орать что раст хуйня, потому что баги какие-то неуловимые, ведь ты не хотел падать на подстеленную разработчиками соломку сейф раста, а полез в ансейф раст, не понимая всех тонкостей UB и того, почему абстрактная машина раста и реальные процессорные команды — это разные вещи.
Я передумал. Допустим есть
struct SomeStruct {
A: String,
B: String,
}
В main где-то там я делаю
let mut Ss:SomeStruct;
if 1 < 2 {
Ss.A = 123;
}
if 4 > 3 {
Ss.B = 456;
}
Вот тут ошибка компиляции почему-то.
Блять, там не String, а i32. Но проблема в том, что не даёт изменить значения.
Ебануться, блядь.
Ты пробовал читать и вникать в ошибки компилятора, вместо того чтобы сразу кричать рррряяяяя?
Есть бы хоть один писал нормально, а не так, как принято в раст-комьюнити. Нахер, короче, вас всех с вашим говном без задач.
Ты растбука не читал, ошибки не читаешь, и думаешь в узких рамках своего предыдущего бэкграунда. Дело не в комьюнити, а в тебе. Just sayin
Мог бы еще прийти в хаскель тред и сказать:
- Так, ебана, как у вас тут сделать глобальную мутабельную переменную? Какие монады-шмонады? Как мне разыменовать указатель ебана.
Большая часть сотрудников транс и лгбт-персоны. Пишут графику игры на Rust. Пишут графику и шейдеры на Rust. Поддерживают BLM.
Как бы я хотел бы попасть к ним. Почему я не живу в Швеции?
https://github.com/EmbarkStudios
да, рил крута
Заёбы мозиллы меньше влиять будут.
хорошо, что соблюден гендерный баланс, но как блм активист я не понимаю почему нет представителей черной расы в директорах.
https://rocket.rs/
https://actix.rs/
Выбирай на свой вкус. У рокета еще есть асинк-ветка, которую пока не релизнули. Я пользуюсь с осени, полет нормальный.
Наскольно рокет проще для вкатывания? Вижу у него работа с шаблонами лучше, tera юзается, очень похоже на шаблоны в го.
Он супер простой. Если хочется посмотреть как делать плюс минус реалистичные вещи: https://github.com/TatriX/realworld-rust-rocket
Я сидел с ней в баре в Москве на расто-конфе пару лет назад. Ничего особенного в ней нет, просто человек.
осуждаю!
Попробуй наоборот.
Объясните в чем смысл языка. Искал себе какой-то язык для души, чтобы по кайфу что-то писать. Попробовал хаскель, очень круто, но как-то сильно заебисто, много сомнительных моментов, таких как отсутствие скобок, везде тайп классы, инкапсуляций и методов нет.
Поэтому решил посмотреть раст. С чего можно начать изучение? Может есть книги и тд. Я начал с онлайн книги на офф сайте, но она очень нудная, прям для очень начинающих.
https://rust-lang.ru/
В колонке "изучить Rust: " всё твоё. Не знаю что тебе ещё нужно.
Можешь ещё навернуть тег на хабре: https://habr.com/ru/hub/rust/
>Объясните в чем смысл языка
Смысл языка в инклюзивности и нулевых абстракциях без утечек памяти в сейф моде. Язык для системников ака байтоёбов. Всех других от него рано или поздно начинает тошнить.
В trpl читай только главы про лайфтаймы\трейты\обработку ошибок и т.п., вместо вводных глав и прочей хуйни пробегись по rust by example + rustlings. Потом читай embedded book, ну или что ты там хочешь делать. Местных не слушай, тут одни хуесосы сидят (как всегда).
Я не понимаю, что вам так бомбит.
Имеют деньги и балуются. Это как раньше были какие-то мини-юбки или татухи.
У васянов на конкретных сайтиках. Я помню, какой ад был на качкобабах, а теперь если нет качкожопы то пиздец трагедия.
>Это как раньше были какие-то мини-юбки или татухи.
>>1944021
>качкобабах
>качкожопы
Причём тут качкобабы и качкожопы? Это не мода и не сиеминутное решение, которое можно откатить. Это выбор человека и их нужно в этом поддерживать. Это если про лирику.
А если по существу: khyperia охуенная, rust-gpu охуенный (это реально прорыв и возможно будущее геймдева), holmes охуенная (посмотрик какие полезные ролики она мутит на ютубе).
Поэтому все трансфобы и прочие дегенераты идут лесом.
На женщине не должно быть мужской одежды, и мужчина не должен одеваться в женское платье, ибо мерзок пред Господом, Богом твоим, всякий, делающий сие.
Второзаконие 22:5
>и их нужно в этом поддерживать
Нет, не нужно. За поддержкой можешь в твиттер съебать, дегенеративный жополаз.
Ты так цитируешь, как будто это оригинал, а не четырежды проёбанный перевод, который был адаптирован под нужды небритых варваров.
> БОХНАКАЖЭТ
Сук, чёт ржу. Неспроста говорят что мы переживаем технологическое средневековье.
Перевод хороший. Можно спорить о не совсем точно переданной стилистике, но суть и смысл библейского текста переданы верно. Текст на древнееврейском можешь посмотреть здесь:
https://www.mechon-mamre.org/p/pt/pt0522.htm
>>1944087
Если у тебя в силу того, что ты окружил себя технологиями, отсутствуют убеждения и принципы, либо ты их имплицитно воспринял от своего окружения в качестве "актуальных", то это не значит, что другие такие же.
Ладно, прекращаю офтоп.
> либо ты их имплицитно воспринял от своего окружения в качестве "актуальных"
Ну а ты конечно же свои принципы и убеждения сформировал сам в глубокой медитации и разговоре с абсолютом, и библия с христианами тут совсем не причём, да? А главное свято уверовал, что если мужик надел платье, то у него ни принципов, ни души, ни сердца, и его нужно сжечь на костре.
>>1944169
Лучше всего забить на это хер, не оценивать, ни плохо ни хорошо. У трансгендеров почти всегда нет детей, они никогда не станут большинством, скорее будут в роли малочисленного генетического шума.
> противоестественными разрушительными вещами
Люди курят, бухают, дрочат, сосут члены, обжираются, смотрят кинцо, в том числе аморальное, играют в игоры, в том числе с жестокостью, ходят в казино, делают ставки, хулиганят, совершают тысячи разных преступлений. Но всё внимание получают мужики на гормонах в юбках. Это похоже на латентную гомосексуальность, подумай об этом.
>то у него ни принципов, ни души, ни сердца, и его нужно сжечь на костре
Где ты это увидел? Ты пытаешься возразить ценностному суждению: транссексуальность это неестественно и плохо. Какие костры? Я не испытываю ненависти к людям, говоря, что они делают что-то неправильно.
Если абстрагироваться от конкретных людей, то в целом тенденция нездоровая еще и по той причине, что ее финансово подпитывают фармацевтические корпорации. А у людей потом здоровье рушится из-за решения "сменить пол" и сидеть на препаратах.
>У трансгендеров почти всегда нет детей
Чем больше таких людей, тем хуже для общества. Опять же, без ненависти к ним. Люди, которые создают нормальные семьи и заводят детей, обычно думают о будущем, делают разумные инвестиции, поддерживают стабильность в обществе, в котором живут. ЛГБТ-пары зачастую живут одним днем, у них редко бывают дети, стало быть, они безразличны к будущему и к среде, в которой находятся.
С экономической точки зрения разумнее жить в обществе, где традиционные ценности стимулируют людей заботиться о себе, свои детях и обществе в целом. Алсо еще Макс Вебер показал важность христианской трудовой этики для капитализма, так что есть много аргументов в пользу того, что верующие семейные люди создают стабильное и успешное общество.
>Но всё внимание получают мужики на гормонах в юбках
Не вижу, чтобы им уделялось сколь либо большое внимание. У тебя какой-то свой информационный пузырь, выходи из дома хоть иногда.
>Это похоже на латентную гомосексуальность
Странная аргументация. BLM-активисты - латентные белые расисты, геи - латентные гомофобы, трансы - латентные трансфобы, ага.
>Чем больше таких людей, тем хуже для общества
Этих людей мало, просто они бросаются в глаза. Где я эти фотки взял есть ещё 60+ человек, но если бы я постил их фото, то у тебя скорее всего возник вопрос - что это за ноунеймы? Но именно на трансов у тебя встал и ты начал рассказывать про будущее общества.
>Люди, которые создают нормальные семьи и заводят детей, обычно думают о будущем
Окей, сейчас наша медицина в говне. Если завтра какой-нибудь мужчина сменив пол сможет рожать детей и не будет испытывать проблем с здоровьем - это изменит твою позицию? И почему? Ещё 50 лет назад трансы могли разве что переодется в женщину, аля Верка Сердючка. Сегодня они могут полностью преобразить свою внешность до неузнаваемости. Завтра они будут рожать детей как и обычные женщины.
>важность христианской трудовой этики для капитализма, так что есть много аргументов в пользу того, что верующие семейные люди создают стабильное и успешное общество.
Я согласен с этим, но проблема в том, что именно капиталистическое общество рушит современный институт семьи и позволяет существовать трансам. Капитализм и любые религиозные принципы - несовместимы.
>чтобы им уделялось сколь либо большое внимание
Ой. А как это сочетается с 4 абзацами текста от тебя про неестественность трансгендеров?
>Ой. А как это сочетается с 4 абзацами текста от тебя про неестественность трансгендеров?
В треде зашел разговор эту тему, я запостил цитату, отражающую мое мнение, мне сказали, что это мнение средневековое и "так нельзя", в ответ я подробно изложил свою позицию. Все. Больше нечего добавить.
Раст это больше чем язык программирования. Это революция, это протест. Тут не бывает оффтопа. В прошлых тредах мы обсуждали политику, железо, другие языки, игры, геймдев...
> Ещё 50 лет назад трансы могли разве что переодется в женщину, аля Верка Сердючка. Сегодня они могут полностью преобразить свою внешность до неузнаваемости. Завтра они будут рожать детей как и обычные женщины.
Да нихуя. Что тогда, что сейчас, если начнешь пить таблетки в подростковом возрасте, то станешь няшей, а если тебе в 30 стрельнет в голову, что ты женщина, то станешь мужиком в юбке.
По технологиям вообще ничего не поменялось, разве что пластика немного улучшилась. Но ее то все равно могут позволить далеко не многие, да и ложиться под нож такое себе удовольствие. а искустаенные пезды так и не научились делать, вместо них гниющая рана из которой воняет говном
не думал что буду писать про трапов в треде про язык программирования
Применятся гормональная терапия (и соответственно массово тестироваться начала только в 80-90х годах). В том числе это совпало с изменением юридического статуса трансов и лгбт. Чтоб сегодня в подростком возрасте ты мог стать няшей - мужики по всему миру из под полы юзали гормоны почти 100 лет.
Про пластику вообще не стоит и говорить. До нулевых даже силиконовые сиськи выглядили как надутые шары (если ретро порнуху смотрел то понимаешь). Сейчас ты на глаз едва-едва сможешь определить. Больше опыта накопилось в ринопластике, в лицевой хирургии, куча косметических операций. Та же вагинопластика в более-менее адекватном виде появилась только в конце 90х/начале 00х, до этого были по сути подопытные кролики.
50 лет назад гомосексуализм считался психическим расстройством по МКБ, на секундочку. Про трансов молчу. Тебе не гормоны, тебе галоперидол могли всерьёз выписать.
>если тебе в 30 стрельнет в голову, что ты женщина, то станешь мужиком в юбке.
Natalie Mars сделала переход в 30
мимо
>>1944680
>>1944633
>>1944478
>>1944359
>>1944287
>>1944218
>>1944169
Модер, блядь, бери вилку и чисти это говно.
И это инженеры? Говно какое-то, пидоры, блядь. Родина им дала доску — обсуждай! Обсуждай Rust, блядь! Не хочу, хочу жрать говно и на членодевок дрочить! Что такое? Это /pr/?! Это тематика?! Суки… Мудачьё — программисты. В тред зашли, говно жрут — пидоры, блядь, ёбаные…
> А у людей потом здоровье рушится из-за решения "сменить пол" и сидеть на препаратах.
Не переживай за чужое здоровье. Они знают на что идут, я спрашивал.
> ЛГБТ-пары зачастую живут одним днем, они безразличны к будущему и к среде
Традиционные семейные пары не семи пядей во лбу, и подавляющее большинство живёт от получки до получки, потому что планировать что-то без денег бессмысленно. Почему ты решил что именно ЛГБТ живут одним днём? Представь, эти гормоны, операции, сколько это денег и дисциплины.
> С экономической точки зрения
Говорят, геи вполне платёжеспособны, не просто на уровне, а даже выше среднего.
> BLM-активисты - латентные белые расисты, геи - латентные гомофобы, трансы - латентные трансфобы, ага.
Это кстати не так далеко от истины как кажется.
> Не вижу, чтобы им уделялось сколь либо большое внимание.
Я конкретно про тебя. Зачем ты пришёл ITT читать проповеди с выдержками из библии? У нас тут инклюзивность и членодевки с неграми и девственниками в контрибьюторах, и мы не суд нравственности.
>>1944802
Ты думаешь просто так везде вводится code of conduct? Инженеры конечно прекрасны в инженерии, но житейские проблемы приходится объяснять на пальцах.
>и мы не суд нравственности
Тогда не указывай людям, за кого им можно переживать, а за кого нет, и кому что высказывать. Иначе ты сам себе противоречишь.
Есть жизнь внутри комьюнити, есть жизнь вне комьюнити. Внутри мы дружные зайки и все друг друга любим и уважаем. А вовне можешь хоть человечину жрать на завтрак. Главное правило — не суди за жизнь вне комьюнити. То есть, христианство, семейные ценности — да пожалуйста, неплохой выбор, и в целом это не моё дело как ты живёшь у себя дома.
>Есть жизнь внутри комьюнити, есть жизнь вне комьюнити
Во-первых, это разделение иллюзорно, ты не сможешь провести четкую грань, где комьюнити заканчивается и начинается "жизнь вне".
Во-вторых, даже если рассматривать ситуацию в рамках этого условного разделения, люди заявляют о своих сексуальных предпочтениях внутри самого комьюнити, давая окружающим знать о своей личной жизни и рассчитывая на поддержку. А люди вправе не поддержать их и высказать свое мнение об этом. В ответ люди вроде тебя вправе высказать свое мнение.
>Чем больше таких людей, тем хуже для общества.
Да, но чем больше люди размножаются, тем хуже для текущего состояния человечества. Мы до сих пор не озеленили Марс, а количество мешков с мясом, которое может поддерживать Земля скоро пересечёт критическую отметку. Выбирая между группой сознательно — или не очень сознательно — отказавшихся от размножения людей, децимацией всего человечества, или вымиранием человечества, лично я голосую за первое.
Проблема в растущих запросах людей на потребление. Даже если бы население Земли составляло всего один миллиард, то с ростом потребления они бы все равно смогли эпично растратить все ресурсы планеты.
Без повсеместного распространения разумной этики потребления бессмысленно заботиться о перенаселении. Ты можешь не заводить детей, но тратить столько же ресурсов, сколько тратит скромная многодетная семья. В идеале ты бы мог отказаться от использования автомобилей, самолетов, компьютеров, электричества, жить за счет выращиваемых в собственном огороде овощей и фруктов и т. д. Но не отказываешься же наверное. У тебя мотивации мало для этого, как и для того, чтобы бросить усилия на программу освоения Марса.
Кстати у нас, христиан, есть представление о cultural mandate, о разумном использовании мира, который дан Богом, поэтому нас эта тема тоже беспокоит. Но отказ от воспроизводства не вариант, потому что Бог заповедал верующим плодиться и размножаться, стало быть, пусть будет больше рационально мыслящих религиозных людей которые помогут (в идеале должны помочь) остальным.
>Это выбор человека и их нужно в этом поддерживать.
Зачем? Это их выбор, они знали на что идут
>>1945216
О чем вы вообще? Мы пищи производим в три раза больше, чем нужно. Проблема не в потреблении, проблема в перепроизводстве и неэффективном распоряжении ресурсами.
>>1944287
Вебер жил в протестантском обществе емнип, а у протестантов своя этика, отличная даже от католической.
Что же касается этики - лол, с такой точки зрения лучше всего обществу подходят марксизм или национализм, они в принципе построены вокруг социально-эволюционно выгодного коллективизма. Но если все мерить заботой о будущем и общем, то лучше вообще вводить человейник и бургундскую систему сразу.
>которое может поддерживать Земля скоро пересечёт критическую отметку
Так говорят уже лет 100 с чем-то. За это время население увеличилось в несколько раз.
>Вебер жил в протестантском обществе емнип, а у протестантов своя этика, отличная даже от католической.
В этике протестантов была как общехристианская часть, так и непосредственно протестантские установки. Профиты, которые получил мир от Реформации, это понимание, что возможна мирская аскеза - честный труд и отсутствие стремления к роскоши. Такое экономическое поведение позволило людям накапливать финансовый капитал, а потом инвестировать его во благо общества. В православии это тоже возможно, в качестве примера можно вспомнить старообрядческих предпринимателей в Российской Империи.
>лучше всего обществу подходят марксизм или национализм
Это путь к тоталитаризму. Христианские ценности подразумевают индивидуализм и добровольность. Каждый отвечает за себя и трудится на совесть, понимая, что ему надо не трудодни отработать, а выполнить свою работу качественно и без халтуры. Мотивация тут одна - у тебя есть жизненное призвание, данное тебе Богом, и Бог видит твой труд.
All the “validation” you get is two-faced and half-hearted. Behind your back people mock you. Your parents are disgusted and ashamed of you, your “friends” laugh at your ghoulish appearance behind closed doors.
Men are utterly repulsed by you. Thousands of years of evolution have allowed men to sniff out frauds with incredible efficiency. Even trannies who “pass” look uncanny and unnatural to a man. Your bone structure is a dead giveaway. And even if you manage to get a drunk guy home with you, he’ll turn tail and bolt the second he gets a whiff of your diseased, infected axe wound.
You will never be happy. You wrench out a fake smile every single morning and tell yourself it’s going to be ok, but deep inside you feel the depression creeping up like a weed, ready to crush you under the unbearable weight.
Eventually it’ll be too much to bear - you’ll buy a rope, tie a noose, put it around your neck, and plunge into the cold abyss. Your parents will find you, heartbroken but relieved that they no longer have to live with the unbearable shame and disappointment. They’ll bury you with a headstone marked with your birth name, and every passerby for the rest of eternity will know a man is buried there. Your body will decay and go back to the dust, and all that will remain of your legacy is a skeleton that is unmistakably male.
This is your fate. This is what you chose. There is no turning back.
>Такое экономическое поведение позволило людям накапливать финансовый капитал, а потом инвестировать его во благо общества.
Упускается тот факт, что без колониализма всего бы этого не было. В Китае конфликт между знатью и богатыми, без которого невозможно зарождение капитализма, начался еще во времена Конфуция и Шана Яна, но капитализм не зародился. Не было условий для этого.
>Христианские ценности подразумевают индивидуализм
Христианские ценности что только не подразумевают, и как их только на глобус не натягивали. Какбэ сравни свое понимание, христианских социалистов, крестоносцев какую-нибудь обскурную ветвь вроде мессалианцев (которые считали, что Бог познается через чувственные удовольствия, а труд - грех и им должны заниматься рабы) и Милонова какого-нибудь. Все эти граждане искренне считают, что действуют в духе тру-христианства.
>Упускается тот факт, что без колониализма всего бы этого не было
Согласен, это повлияло на развитие капитализма. Но у тех же старообрядцев и без колониализма взлетело. Даже в условиях гонений.
>Все эти граждане искренне считают, что действуют в духе тру-христианства
Пусть считают. В Писании сказано: "по плодам их узнаете их". Не вижу каких-то годных результатов у христианских социалистов. Насильственный отъем частной собственности и присвоение чужого считаю преступлением, так что считаю, что последовательный социализм вряд ли может быть христианским.
Я за минимальное государство по Нозику и за создание частных благотворительных фондов, которые будут помогать нуждающимся и обустраивать общество по мере возможности. Если какие-то общины христиан хотят иметь общее имущество, то без проблем, пускай создают такие общины, но на добровольной основе. Как гуттериты, например.
>Но у тех же старообрядцев и без колониализма взлетело.
Настолько взлетело, что капитализма в РИ так и не построили по факту, лишь в последние лет 50 какие-то зачатки появились.
Ну и не будем забывать, в руках какой национальности (а следовательно религии) находится большая часть крупного капитала.
>Насильственный отъем частной собственности и присвоение чужого
А социалист (даже не христианский) скажет тебе, что это капиталист присваивает себе чужой труд, а рабочий трудится на него, потому что ему нужен жрат. То есть с точки зрения соци как раз капиталист бака и бяка. Не все так однозначно.
Да и Спаситель вполне себе устроил погром в храме, нанеся существенный экономический ущерб честным торгашам внутри.
>Я за минимальное государство по Нозику
Государство - это дракон, который существует, чтобы новые драконы не появлялись. Собсно, общество потребления тому пример - утопи золотой миллиард в гедонизме и удовлетворении любых прихотей, чтобы рыночек продолжал крутится. Как я уже говорил, мы пищи в три раза больше необходимого производим, а у нас в Африке голод - просто потому что выкинуть пищу рентабельнее, чем везти в Африку и раздавать там.
Оговорюсь, что не соци и не рыночник, разочаровался в идеологиях в принципе. То же самое и с религией - был православным, теперь... нечто иное.
>чем везти в Африку и раздавать там.
Чтобы они плодились ещё быстрее и приходилось везти им ещё больше еды...
Не в этом дело. Они просто не заплатят столько, чтобы это было разумно. Выкинуть пищу дешевле, чем продать в Африке.
А ничего. Тут хрестьянин сверху распинался, что свобода, Боженька и рынок все организуют - ан нет, у нас жуткий перерасход ресурсов и их нехватка при избытке (!!!). Иногда мне всерьез начинает казаться, что концлагерь - лучший способ организации человечества.
Перерасход и избыток человеческого ресурса, а еды столько сколько надо. Да и есть ли нехватка, если население черной Африки всё ещё растёт
Ну, по статистике ООН у нас миллиард человек голодает, так-то. Опять же, не вся Африка голодает, и не все африканцы размножают как кролики; в Индии примерно такая же шняга.
А то, что еды сильно больше, чем нам нужно - это тоже факт, в Америке же даже целое движение есть, которое питается чисто за счет выкинутой за ненадобностью пригодной пищей. Просто в России за счет менталитета и меньшего достатка подобное принимает не такой лютый характер (хотя вспомни начало санкций, лол).
> в Америке же даже целое движение есть, которое питается чисто за счет выкинутой за ненадобностью пригодной пищей
В мурике просто сумасшедших изолировать не принято, лол.
А ты подумай - что в этом такого, если не отталкиваться от нашего менталитета? Еда - вполне свежая, бесплатная, на любой вкус, в упаковке. Ее просто не успеют продать, а потому обычно держат на заднем дворе пару дней как раз для таких ребят, хотя с ними пытаются бороться - если ты ешь нахаляву, ты не создаешь спроса.
В США в каждом супермаркете стоит пресс для уничтожения просроченных продуктов. Просто потому что если кто-то траванется едой из супермаркета, даже выброшенной, то есть риск судебных исков.
Поэтому чтобы найти просрочку в США я даже не знаю как надо извернуться и в какие помойки залезть.
Ты так говоришь, как будто в каждом штате законы одинаковые.
Так они ж не покупают, а побирают. В том-то и фишка.
>Второзаконие 22:5
Нагорную проповедь прочитал, ИИссус сказал, что то кто заповеди соблюдает в рай не попадет. Моисеевы законы отменяются.
Rust сообщество это протест, пошел нахуй трансофоб
index = index + index_add - index_sub
Раст норм, не обращай внимания на тролля. Просто в треде завели ненужные споры про личную жизнь контрибьюторов, а потом вообще ушли в обсуждение религии и политики.
Но если контрибьюторы пидоры/ЛГБТ шавки, то выходит что Раст зашкваренный язык от выебанных петухов в жопу, не? Ровным пацанам его юзать нельзя получается.
Расскажи, чем сам пользуешься, вдруг там ЛГБТ или ЛГБТ-френдли челики затесались среди контрибьюторов. Вдруг ты зашкварен уже.
Можно, если превратить usize в isize, а потом обратно. Но то, что индексы только usize — это охуенно на самом деле, решает целую кучу проблем.
index = (index as isize + index_add + index_sub) as usize;
Не уверен насчет конкретно твоего случая, но оно бывает полезно. Алсо есть чекед/врап/оверфлов адд/саб
@
ГАЙД НА ПОЛТОРА ЧАСА КАК СПЛИТИТЬ СТРОКИ
https://www.youtube.com/watch?v=rAl-9HwD858
Раст не простой, раст правильный. Если надо просто — голанг.
>ГАЙД НА ПОЛТОРА ЧАСА КАК СПЛИТИТЬ СТРОКИ
Это не гайд - это по сути стрим, где челик тупо включил камеру и начал вещать.
Вот тебе лекция на полтора часа по плюсам: https://www.youtube.com/watch?v=JGu-4McXVok
>C++ СЛИШКОМ СЛОЖНЫЙ, НАМ НУЖЕН ЯЗЫК ПОПРОЩЕ
Сам выдумал хуйню и сам её "опровергаешь"?
>Это не гайд - это по сути стрим, где челик тупо включил камеру и начал вещать.
Окей гайд не может быть в виде стрима.
>Вот тебе лекция на полтора часа по плюсам:
>класс String
Во первых это не лекция, а по сути стрим, челик просто включил камеру и начал вещать, во вторых это про String, а не &str.
А, всем спасибо, я допёр. Можно всего лишь 10 умножить на корень из 3.
Если буду дебильными вопросами тред закидывать - обосрете?
Нет, у раста самое приветливое коммьюнити из языков программирования.
Да, обосрём, потому что ты не прочитал растбук. А если прочитал, то у тебя не будет совсем дебильных вопросов.
>А если прочитал, то у тебя не будет совсем дебильных вопросов.
Здесь ты не прав, киддо. Я ведь не уточнял, что дебильные вопросы будут касаться раста а не ООП
Кря
Возможность опускать return
Last statement еще куда не шло, но в середине функции, с несколькими возможными return (без самого return)?
Это выглядит очень неочевидно и проглядывает возможность допустить ту же ошибку, которую люди допускали в плюсах, написав вот так: while (hui = pizda) (очевидно поставив = вместо ==)
Немного погуглив нашел вот это: https://stackoverflow.com/questions/27961879/why-is-using-return-as-the-last-statement-in-a-function-considered-bad-style
И что-то никаких конструктивных причин не вижу, кроме меньше нужно печатать
Поясните, это я зашоренный, если считаю return очень важным борлеплейтом, без которого только хуже, или это окей и можно легко привыкнуть?
И как прерывается ничего не возвращающая функция?
Через return?
> Возможность опускать return
В отличии от паскаля с "процедурами" и "функциями", в расте все функции всегда возвращают какое-то значение. Часто это значение () типа (). За счет синтаксического сахара ты можешь его не указывать явно:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=8686c254e8498adbfd33ef63ab40f3f1
foo и бар отличаются только наличием сахара.
Точка с запятой по сути позволяет выкинуть нахуй текущее значение и превратить его в ()
Представь себе, ЛГБТ-пидоры дышат тем же воздухом, что и ты, так что ты автоматически зашкварен, т.к. делаешь то же самое, что и эти мерзкие пидорасы.
Чтобы остаться ровным пацаном, тебе прямо сейчас нужно задержать дыхание и перестать дышать до тех пор, пока ты не задохнешься и не обмякнешь под себя.
Есть ряд обработчиков, у обработчиков есть данные на входе и выходе. Задача - описывать порядок выполнения этих обработчиков в текстовом файле, чтобы можно было выполнять разные наборы в разном порядке без перекомпиляции программы.
Пока не понимаю, можно ли это вообще сделать на расте, и если да - то как.
Может, у кого-то будут советы, в какую сторону копать.
Допустим, будет такой трейт:
trait Step<I, O> {
fn process(input: I) -> Result<O, Error>;
}
И пара реализаций:
struct Handler1;
impl Step<u32, String> for Handler1 {
fn process(input: u32) -> Result<String, Error> { ... }
}
struct Handler2;
impl Step<String, bool> for Handler1 {
fn process(input: String) -> Result<String, Error> { ... }
}
И надо описать в текстовом файле порядок вызовов, например будет такой yaml:
steps:
- type: Handler1
input: ScalarValue(100)
- type: Handler2
input: PreviousStepResult
Мне надо десериализовать это в нужные обработчики, запустить в нужном порядке и подать на вход нужные данные, желательно проверив перед этим совместимость типов, и если тип не совпадает, то выводить ошибку.
И вот тут у меня ступор, в расте ведь нет рефлексии, можно ли как-то реализовать такое, или лучше смотреть в сторону более динамических языков?
Есть ряд обработчиков, у обработчиков есть данные на входе и выходе. Задача - описывать порядок выполнения этих обработчиков в текстовом файле, чтобы можно было выполнять разные наборы в разном порядке без перекомпиляции программы.
Пока не понимаю, можно ли это вообще сделать на расте, и если да - то как.
Может, у кого-то будут советы, в какую сторону копать.
Допустим, будет такой трейт:
trait Step<I, O> {
fn process(input: I) -> Result<O, Error>;
}
И пара реализаций:
struct Handler1;
impl Step<u32, String> for Handler1 {
fn process(input: u32) -> Result<String, Error> { ... }
}
struct Handler2;
impl Step<String, bool> for Handler1 {
fn process(input: String) -> Result<String, Error> { ... }
}
И надо описать в текстовом файле порядок вызовов, например будет такой yaml:
steps:
- type: Handler1
input: ScalarValue(100)
- type: Handler2
input: PreviousStepResult
Мне надо десериализовать это в нужные обработчики, запустить в нужном порядке и подать на вход нужные данные, желательно проверив перед этим совместимость типов, и если тип не совпадает, то выводить ошибку.
И вот тут у меня ступор, в расте ведь нет рефлексии, можно ли как-то реализовать такое, или лучше смотреть в сторону более динамических языков?
Дело в том что в расте if, match это выражения (expressions), у которых есть результат. Даже если они многострочные. Это не statements как ты привык. То есть там не проставляется неявный ретурн, а всё так же просто возвращается результат последнего expression, даже если это ветвистый match на 300 строк.
>И как прерывается ничего не возвращающая функция?
В расте все функции что-то возвращают, просто синтаксический сахар позволяет скрывать возвращаемый init, который выглядит как (). Когда ты поймёшь, что все функции что-то возвращают, и что можно написать
let init_var: () = { let x = 1; };
ты поймёшь, почему твой вопрос не имеет смысла. Ведь если твоя функция заканчивается на let x = 1;, то поскольку это выражение возвращает (), то и функция возвращает (). Любая функция в расте прерывается либо return, либо последним выражением в теле функции, и функций, которые ничего не возвращают, в расте тупо отсутствуют как класс.
Из-за того, что выражения типа if или match или любые блоки кода — let x = { ... };, где блок кода показан многоточием — могут возвращать значения, вместо ебаной лапши, где непонятно, куда и что возвращает return, разделили возврат из блока и возврат из функции. Так что return всегда закрывает функцию, а не блок; возможность опустить return в конце функции — просто синтаксический сахар, потому что функция выглядит как тот же блок кода.
Проще говоря: отсутствие return при возвращении значения — это важная часть раста, и ты можешь её удалить из большей части раста, не сломав какой-нибудь код вроде
fn x() {
let x = if true { return; } else { 1 };
println!("{}", x);
}
Подавляющее большинство описывается поговоркой "когда коту делать нечего, он яйца лижет"
Что ты хочешь услышать? Почему тебе стоит продолжать писать на плюсах в 2021? Пиши, разрешаю. С киллер-аппом немного таки беда, это правда, но кому сегодня нужен киллер-апп? От того что линукс и постгрес написаны на си, полмира не бежит делать свои проекты на си.
>>1954281
>>1954429
Спасибо за ответы, по большей части прояснилось
Остался только вопрос консистентности
Правильно ведь я понимаю, что в ситуациях, вроде такой:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=aaaa77e90c6487183ee3fdcf9d348173
Другого выбора (кроме явного return) у меня нет?
Выглядит как линейная цепочка if | else if | else, которая тоже одно единственное выражение.
if {
....раз
....два
....три
....true // возможный результат цепочки if
} else if {
....раз
....два
....три
....false // возможный результат цепочки if
} else {
....раз
....два
....три
....true // возможный результат цепочки if
}
Но если тебе проще где-то использовать return, нет ничего плохого чтобы таки использовать return.
В моей голове явный return это маркер раннего выхода из функции.
Забавно что никто из ответивших не упомнул что любой блок - {} в расте - это выражение, а значит возвращает результат:
let expr = {};
expr = 1; // error, as {} returns ()
Объявления item'ов ( https://doc.rust-lang.org/reference/items.html ) ничего не возвращают.
let например.
Под "нормально работает" ты имеешь ввиду "тормозит как жава иде" и "жрет гигабайты памяти"?
Если писать свою ОС, то наверное, но мне для мелких экспериментальных крейтов хватает. Не то чтобы мне светит писать что-то в продакшене.
У меня растущее фулстек приложение на 20k/3k строк и 10 гигов оперативы сжираются в никуда. Боюсь представить что происходит с проектами побольше.
Если его на написать на нормальном расте он тоже будет летать. Моя гипотеза - жава головного мозга у автора. Люди с жава бэкграундом привыкли жрать говно и что софт тормозит и жрет гигабайты памяти.
>>1957473 →
https://matklad.github.io/resume/
Автор хруст-аналайзера работал на джетбрейнс и лабал на котлине перед этим.
Джава травмирует мозг, как бэйсик когда-то: https://www.goodreads.com/quotes/79997-it-is-practically-impossible-to-teach-good-programming-to-students
Мне кстати rls по прежнему нравится больше. Да, он чаще не может справится с поставленой задачей, но пока я пользовался им, у меня не кончалась память на не самой слабой машине и не висло все к хуям, потому что компьютер пытается взлетать и отправится на марс на кулере.
>Нужно сделать Open Folder.
По-русски можно? Я нагуглил проблемы на single file, can't find Cargo.toml Но у меня каталог прожекта создан cargo init my_app
Да на память пофиг, я и половины из доступной не использую, хотя сижу на гномощели.
У меня 16 гигов и мне приходится периодически убивать rust-analyzer и/или firefox чтобы система не зависла, потому что оно начинает течь.
Блять, я так и сделал. Ладно, хрен с ним. Лучше скажите как рефакторнуть функции, если я подобавлял в начале имени нижнее подчёркивание чтобы оно не писало мне варнинги. Как сделать глобально #[allow(dead_code)] я не нашёл.
А то я пишу снизу вверх и меня уже начинает бесить куча варнингов.
Ага, #![allow(dead_code)]
Объебался тредом, простите.
Что скажете о GUI библиотеке Iced? Достаточно ли она зрелая?
Юзабельная. Слегка подбешивает что нужно стейт для виджетов таскать самому. Ну и в плане кастомизации все очень слабо.
Чому бы и нет?
Листаю тур. Конкретно пример с parse()
https://tourofrust.com/71_en.html
Там используется следующая конструкция
let b = a_string.parse::<i32>()?;
соответственно у main() появляется необходимость результат этого действия возвращать и появляется
fn main() -> Result<(), std::num::ParseIntError>
С () всё понятно, мы в конце программы явным образом указываем, что возвращаем Ok(()), а откуда появляется std::num::ParseIntError?
Каким образом я могу выяснить, что мне нужен именно этот метод(?) ParseIntError в num в std? Или что мне может подсказать, что именно он, если я ошибся?
Что я пробовал в редакторе:
Оставлять пустым — "wrong number of type arguments: expected 2, found 1" и пытается объяснить мне, что числоаргументов нужно соблюдать.
Ставить туда юнит () — "couldn't convert the error to `()`" и пытается научить меня, что некоторые типы не умеют в некоторые трейты и как их имплементировать.
Ставить туда Err — "expected type, found variant `Err`" и рассказывает, что возвращать надо тип, а не вариант.
Ставить туда core::result::Result, что мне подсказывали вместе с 4 другими вариантами в последней ошибке, ну и я так понял, это тип для Err — "wrong number of type arguments: expected 2, found 0" и учит меня опять первому.
Переменную, допустим, е — "cannot find type `e` in this scope"
Константу 5 — "constant provided when a type was expected"
На этом моя фантазия иссякла.
Пошёл смотреть доки по функциям (точнее я это сделал почти сразу, но так нарратив веселее), нашёл
https://doc.rust-lang.org/stable/std/primitive.str.html#method.parse
Там сигнатура обозначена как
-> Result<F, <F as FromStr>::Err>
Соответственно попробовал <F as FromStr>::Err> — "failed to resolve: use of undeclared type `FromStr`"
Кликнул на Err, каконец-то увидел пояснение, что "The error type is specific to implementation of the trait." (что было, конечно, очевидно из текста примера)
Так вот, как я, простой иван из города тверь, должен понять, какая ошибка там нужна? Кроме того, чтобы сделать поиск по слову parse
https://doc.rust-lang.org/stable/std/?search=parse
и найти 10 разных видов ошибок с этим словом в названии из совершенно разных модулей? Как выбрать нужную? А если в названии слова parse не было, то как бы их, вообще, можно было откопать?
Листаю тур. Конкретно пример с parse()
https://tourofrust.com/71_en.html
Там используется следующая конструкция
let b = a_string.parse::<i32>()?;
соответственно у main() появляется необходимость результат этого действия возвращать и появляется
fn main() -> Result<(), std::num::ParseIntError>
С () всё понятно, мы в конце программы явным образом указываем, что возвращаем Ok(()), а откуда появляется std::num::ParseIntError?
Каким образом я могу выяснить, что мне нужен именно этот метод(?) ParseIntError в num в std? Или что мне может подсказать, что именно он, если я ошибся?
Что я пробовал в редакторе:
Оставлять пустым — "wrong number of type arguments: expected 2, found 1" и пытается объяснить мне, что числоаргументов нужно соблюдать.
Ставить туда юнит () — "couldn't convert the error to `()`" и пытается научить меня, что некоторые типы не умеют в некоторые трейты и как их имплементировать.
Ставить туда Err — "expected type, found variant `Err`" и рассказывает, что возвращать надо тип, а не вариант.
Ставить туда core::result::Result, что мне подсказывали вместе с 4 другими вариантами в последней ошибке, ну и я так понял, это тип для Err — "wrong number of type arguments: expected 2, found 0" и учит меня опять первому.
Переменную, допустим, е — "cannot find type `e` in this scope"
Константу 5 — "constant provided when a type was expected"
На этом моя фантазия иссякла.
Пошёл смотреть доки по функциям (точнее я это сделал почти сразу, но так нарратив веселее), нашёл
https://doc.rust-lang.org/stable/std/primitive.str.html#method.parse
Там сигнатура обозначена как
-> Result<F, <F as FromStr>::Err>
Соответственно попробовал <F as FromStr>::Err> — "failed to resolve: use of undeclared type `FromStr`"
Кликнул на Err, каконец-то увидел пояснение, что "The error type is specific to implementation of the trait." (что было, конечно, очевидно из текста примера)
Так вот, как я, простой иван из города тверь, должен понять, какая ошибка там нужна? Кроме того, чтобы сделать поиск по слову parse
https://doc.rust-lang.org/stable/std/?search=parse
и найти 10 разных видов ошибок с этим словом в названии из совершенно разных модулей? Как выбрать нужную? А если в названии слова parse не было, то как бы их, вообще, можно было откопать?
Кажется, нашёл. Надо в списке Implementors, под пояснением про Err надо, в строчке с нужным тебе типом кликнуть не на i32, не на [src], не на любое другое место в строке, а на [+] слева. Тогда появится строчка
type Err = ParseIntError
В ней надо кликнуть на ParseIntError и там можно увидеть, что это структура
std::num::ParseIntError
её и нужно указывать в fn main() -> Result
непонял полотна ты парсишь строку и результатом идет енам резалт ок и ошибка и ошибка эта будет парс инта, так как ты парсишь инт, ты можешь ее обработать, вернуть в вызывающий код или просто выкинуть панику
>и ошибка и ошибка эта будет парс инта
Ты так говоришь, будто легко угадать, что это ParseIntError, а не какой-нибудь ParseErrorInt, или NotIntError. Почему ни один из инструментов не может это подсказать? Ни компилятор ни clippy.
К тому же, даже если угадаешь базовое название, этого недостаточно, компилятор предлагает три варианта на выбор с одинаковым именем:
core::num::ParseIntError
pin_utils::core_reexport::num::ParseIntError
std::num::ParseIntError
какой я должен взять, и чем они отличаются?
Придумал алгоритм:
Пишешь туда какой-нибудь тип (с другими вариантами не сработает), например String
fn main() -> Result<(), String>
Компилятор жалуется на "couldn't convert the error to `String`" и в одном из пояснений написано, что
" ^ the trait `From<ParseIntError>` is not implemented for `String`"
откуда можно вытащить, что это ParseIntError, который можно записать в результат.
fn main() -> Result<(), ParseIntError>
Тогда выдаёт уже другую ошибку: "cannot find type `ParseIntError` in this scope". и предлагает несколько вариантов, где этот ParseIntError может быть. В том числе и эталонный std::num::ParseIntError, но как выбрать именно его, я всё ещё не понял.
это одна ошибка, просто std экспортирует ее из core, да и вообще все что есть в коре есть и в стд.
то есть если не хочешь ссылатся на стандартную библиотеку/она недоступна по каким то причинам можешь ссылаться на ядро.
Спасибо, сейчас-то мне это понятно, но как быть, если там больше вариантов будет? Не только pin_utils::core_reexport::num::ParseIntError, а разные, и не будет, например ни core::, ни std::?
я не ракообразный, так, поигрываюсь, но у меня в vscode/rust-analyzer получилось так:
1. a_string.parse - Go to definition (F12)
2. parse<F: FromStr> - Go to definition (F12)
3. pub trait FromStr - Go to implementations (Ctrl+F12)
4. на этом шаге появляется дохуя вариантов, но нас интересует файлик /home/anonymous/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/num/mod.rs, где на строках 778-789 находим пикрелейтед.
да чтобы упредить вопрос а нахуя это надо.
кор дизайнился для работы на низкоуровневой голом железе, фактически для ембедедщины и тд, она меньше и проще.
ссылка на сам ParseIntError есть на 55 строке в том же файле.
Пока не знаю, но если там написать вариант, например, Err, то предлагают
anyhow::private
core::result::Result
futures_util::__private
pin_utils::core_reexport::result::Result
and 3 other candidates
Тут тоже core есть, но std уже нет, так что предположу, что и кора тоже может не быть (или, как минимум, не предлагаться в открытых вариантах)
Ты говоришь, что кор будет обязательно? Хорошо, спасибо, запомню.
>но нас интересует файлик
А как определить, какой файлик нас интересует, и, тем более, найти там строки 778-789? Спасибо, что помогаешь разобраться.
>std::result::Result тоже есть
Да, но он не написан, поэтому без догматического знания, что "всё из core есть в std", я об этом не догадаюсь. А я хочу меньше догадываться и больше читать справку, которая мне пояснит, где я дурак.
>фома неверующий
Я простой иван из города тверь, и я хочу разобраться. Готовый ответ уже был в примере.
Я за этим и пришёл!
ну, после первого шага мы знаем, что метод parse под капотом использует трейт FromStr. далее, зная, как примерно работают трейты, мы понимаем, что нужно искать что-то вроде `FromStr for X`, где X это наш тип, а он нам тоже известен - i32.
чтобы найти все такие места в коде, тыкаем Go to implementations на FromStr и видим пикрелейтеды.
варианты с char, bool сразу отметаем. отметаем float_impl (т.к. там f32, f64, это точно не i32). остаются mod.rs и nonzero.rs. идем в nonzero.rs и видим, что там используются какие-то расширения над i32, но у нас-то обычный i32, поэтому тоже отметаем.
остается mod.rs, собственно тыкаем сразу в вызов макроса и попадаем на 789 строку. убеждаемся, что тут нужный нам обычный i32.
остается только понять, что же за ParseIntError (rust-analyzer мне тут не позволяет делать Go to definition, наверное из-за того, что это часть макроса), придется искать вручную. объявление `pub use error::ParseIntError;` встречается на 55 строке.
вот, собственно, и все.
Спасибо!
ты знаешь 100% кодовой базы раста? все патчи проходят через тебя? я описал очевидному новичку общий принцип самостоятельного нахождения ответов на подобные вопросы, неважно, в std лежит код или в каком-то никому неизвестном крейте. что касается знаний, сегодня ты знаешь, завтра это поменяют, знания устареют.
если б проситель изначально знал знал что кор=стд этого вопроса даже не возникло бы, ибо все легко гуглится по интернет доке, тут вопрос изначально в этом был, а не где искать.
>а откуда появляется std::num::ParseIntError?
>let b = a_string.parse::<i32>()?;
Знак вопроса возвращает ошибку, если что-то пошло не так. Можно заменить на unwrap() и убрать Result из определения.
>Каким образом я могу выяснить, что мне нужен именно этот метод(?) ParseIntError в num в std?
Можешь поставить Box<dyn std::error::Error>>
> Как выбрать нужную?
f32 это у нас число? Значит num.
Дочитал. Я понял синтаксис, я не понял, как узнать, что std::error::Error это трейт (имплементацией которого для parse::<i32> является std::num::ParseIntError), который нужно туда засунуть?
Здесь не написано
https://doc.rust-lang.org/stable/std/primitive.str.html#method.parse
здесь тоже
https://doc.rust-lang.org/stable/std/str/trait.FromStr.html#associatedtype.Err
Вот прос не в этом. Где прочитать, что std::num::ParseIntError — это имплементация std::error::Error, а не kern::oshibka::Mistake? В документации по ссылкам не написано.
Вопрос в том, как попасть в Trait std::error::Error из
https://doc.rust-lang.org/stable/std/primitive.str.html#method.parse
?
а еще на резалт и прочитать описание модуля, а лучше прочитать главу учебника про обработку ошибок еще раз.
Ещё раз, как по документации понять, какую ошибку она вернёт? Почему нужно лезть в главу учебника про обработку ошибок? Это что вообще за подход? Почему сигнатуры функции не достаточно, чтобы с ней работать?
>parse<F>(&self) -> Result<F, <F as FromStr>::Err>
>where F: FromStr,
>Associated Types
>type Err
>The associated error which can be returned from parsing.
>Required methods
>pub fn from_str(s: &str) -> Result<Self, Self::Err>
>Parses a string s to return a value of this type.
If parsing succeeds, return the value inside Ok, otherwise when the string is ill-formatted return an error specific to the inside Err. The error type is specific to implementation of the trait.
Трейт FromStr требует ошибку Err и метод from_str.
Конструкция parse::<i32>() означает вызов метода имплементированного для типа i32.
Идем сюда:
https://doc.rust-lang.org/std/primitive.i32.html
На странице находятся все трейты типа i32.
Делаем поиск по странице FromStr, находим
>impl FromStr for i32
>type Err = ParseIntError
>The associated error which can be returned from parsing.
РАСТ ЭТО ПРОСТО И ПОНЯТНО
Box<dyn Error> значит поинтер на любой объект в куче, для которого существует имплементация трейта Error. Для типа ParseIntError такая имплементация есть
Да я уже даже нашёл, просто тот анон хвост распушил, книжку меня отправляет читать, а сам в документации прямой путь показать не может, только уже известное ему слово загуглить.
можешь нахуй сходить.
>Почему надо читать учебник по математике? Почему нельзя просто знать, что 1 + 1 = 2, и из этого сразу понять как быстро умножать и делить в столбик?
У раста охуенные доки, но это не совсем учебник. Ты первый раз видишь раст, но не читаешь учебник по расту. На сишке (или что ты там до раста учил) ты тоже сразу ебошил код, иногда заглядывая в std reference?
Ну, смотри, объясню разницу. Посмотрим на другие методы вокруг. Промотаем вниз
pub fn is_ascii(&self) -> bool
Сразу же понятно, как функцией пользоваться, согласен?
Посмотрим вверху, там посложнее
pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str
Непонятно, что такое P, правильно? Так сразу внизу написано
P: Pattern<'a>,
и пояснено
The pattern can be a &str, char, a slice of chars, or a function or closure that determines if a character matches.
Тоже список примитивных типов.
Вот такое же объяснение я там ожидал увидеть. А там только
Will return Err if it's not possible to parse this string slice into the desired type.
И как это понимать? Вместо bool я ставлю переменную типа bool — она работает, вместо P я ставлю переменную типа Pattern — она работает. Вместо Err я ставлю.. стоп! Err не тип! И начинается пляска с тем, какой же нужен тип. Могли бы ссылку на табличку дать, как в паттерне, могли бы указание на идиому Box<dyn std::error::Error> добавить. Но ничего этого нет.
Не говоря уже о том, что это хотелось бы в компиляторе или в clippy в качестве подсказки увидеть, потому что там пробрасывается вверх уже известная компилятору ошибка (на parse же он не жалуется, жалуется на main), а не лезть в документацию.
Это один из тех людей, которые свято уверены, что по учебникам научиться программировать нельзя, и единственный способ это практика без понимания теории.
Не надо мне слова в рот класть, я ничего подобного не говорил. Я говорил, что в документации должно быть прописано, как пользоваться функцией. Чтобы не было такого, что тебя просят указать определённый тип, но нигде не пишут, что за тип и в зависимости отчего какой указывать. Чтобы не было
>укажите тип
>bool
>не тот тип
и нигде внятно не написано, какой тип тот
и потом пишут такую лютую лапшу что сами разобратся не могут
>Не надо мне слова в рот класть, я ничего подобного не говорил
Да, не говорил, но твои действия говорят за тебя. Прочитай учебник и не выёбывайся.
Во-первых, ты проебался, потому что Pattern не тип, а трейт. Вот Err — это как раз associated type, и можно узнать конкретный тип, посмотрев реализацию трейта у нужного тебе типа. Ты никак не можешь подставить свой тип в Err, и тебе нахуй не надо знать какой там тип, если ты не хочешь обрабатывать ошибку. Но если ты хочешь обрабатывать ошибку, то ты уже знаешь какой там тип, иначе как ты нахуй обработаешь ошибку, если ты нихуя не знаешь про тип ошибки?
А если ты тупо вверх пробрасываешь, но ничего не делаешь с ошибкой, то ты не понимаешь, что ты делаешь.
Что не так?
Но почему её так сложно найти? Почему предложено было искать либо через исходные коды >>1970508, либо через отдельный поиск >>1972256
Я пытался найти прямой путь от
https://doc.rust-lang.org/stable/std/primitive.str.html#method.parse
к Box<dyn std::error::Error>, у меня не получилось.
>>1973006
>А если ты тупо вверх пробрасываешь, но ничего не делаешь с ошибкой, то ты не понимаешь, что ты делаешь.
Но это же просто пример того, как фейлится main, если использовать fn()?; и получить ошибку. Мейны, которые могут завершиться с ошибкой не делают?
Делают, но с какого хуя документация к функции parse должна тебе рассказывать про глобальный функционал типа Box<Trait>? Вот если бы ты читал учебник, то там бы ты сразу увидел вот это вот:
https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html#the--operator-can-be-used-in-functions-that-return-result
>Делают
Тогда я не понял, к чему было
>А если ты тупо вверх пробрасываешь, но ничего не делаешь с ошибкой, то ты не понимаешь, что ты делаешь.
>но с какого хуя документация к функции parse должна тебе рассказывать про глобальный функционал типа Box<Trait>
Хотя бы просто про трейт std::error::Error. Про std::num::ParseIntError я же нашёл (вы даже с этим не справились), почему оттуда внятно ничего не ведёт?
>Вот если бы ты читал учебник
У меня возникает ощущение, что вы читали только учебник и теперь пытаетесь доказывать, что отлично разбираетесь в очень удобных доках, при этом 3 не отвечая на простой вопрос, а рассказывая "ну иди другую книжку почитай, в документации к языку такого не пишут". Я хочу удобную документацию (и подсказки компилятора), а вы что-то хотите, кроме как унизить новичка, пытающегося в этой документации разобраться?
>Хотя бы просто про трейт std::error::Error
Ты совсем тупой дегенерат? В расте over 9000 функций, которые возвращают Result<T,E>, ты предлагаешь к каждой из них давать ссылку на трейт, который может быть даже не реализован для E, просто потому что ты хочешь иметь учебник в доках, а не в учебнике?
Ещё раз для тупых и необучаемых: доки и учебник — это разные вещи. Специально покажу разницу между неудобными и удобными доками.
Неудобные:
Сложение — одна из основных бинарных математических операций двух аргументов, результатом которой является новое число, получаемое увеличением значения первого аргумента на значение второго аргумента.
Удобные:
Сложение (прибавление) — одна из основных бинарных математических операций (арифметических действий) двух аргументов (слагаемых), результатом которой является новое число (сумма), получаемое увеличением значения первого аргумента на значение второго аргумента.
Примеры:
1 + 1 = 2
2 + 3 = 5
1 + -1 = 0
-1 + -1 = -2
С какого хуя тебе в сложении должны рассказать об умножении в столбик, животное?
Если бы ты прочитал описание Box<T>, ты бы узнал, что T: ?Sized. Но тебе это ничем не поможет, потому что ты недостаточно умён, чтобы зная только про 1+1=2 дойти до мнимых чисел, и точно так же ты недостаточно умён, чтобы понять, что если T: ?Sized, то можно сделать Bpx<Trait>. Так что не выёбывайся, а то заебал.
А это случайно не тот челик который в фак треде советует доку читать вместо учебников
>С какого хуя тебе в сложении должны рассказать об умножении в столбик, животное?
>С какого хуя тебе в std::num::ParseIntError должны рассказать об std::error::Error, животное?
Понял твою мысль, спасибо.
Согласен, непорядок. С какого хуя тебе в сложении должны рассказать об умножении в столбик, животное?
Как говорит вики: "умножение определяется как многократное сложение". Ссылки — это не рассказывание.
Кошкодевочки все правильно сделали, Торвальдс, Столман, вся эта старая гвардия топят явно или неявно за меритократию и элитизм в мире софтостроения, а все прогрессивные девочки такое не любят, а любят свободу для всех, равенство, дайверсити и инклюзивити, что полностью противоречит фашистской меритократии белых бумеров-диктаторов из прошлого столетия.
Это код из учебника в шапке:
let mut guess = String::new();
let guess: u32 = guess.trim().parse().expect("Please type a number!");
Расскажите, почему это не динамическая типизация?
Потому что если let, то типа не считается?
Не считается. Есть Any если хочется.
Нисколько, если все будет так продолжаться штульманы превратят опенсорс в тусовочку для себя и своих подсосов.
В расте просто можно создавать переменные с одинаковыми названиями в одной области видимости. При этом первая переменная становится недоступной после объявления второй. При этом у каждой переменной есть свой собственный тип.
В языках с динамической типизацией можно делать так:
let a = 1;
a = "abc";
В расте так нельзя.
Неявное приведение типов означает слабую, а не динамическую типизацию, но если ты решил доколупаться, то это тоже есть в учебнике
let spaces = " ";
let spaces = spaces.len();
Или
let x = five();
Ну, разница только синтаксическая, в rust мы говорим let. Или я что то не догоняю?
Не знаю. Объясню еще раз: let x = ...; создает новую переменную x, с новым типом. Просто x = ...; присваивает значение существующей переменной. У единожды созданной переменной тип изменить нельзя. В языках с динамической типизацией - можно. В расте присвоить переменной значение другого типа нельзя, но можно создать новую переменную с другим типом, с тем же названием. Но это будет уже не та переменная.
Это я понимаю анон.
В одном случае мы старой переменной присвоили новый тип, в другом дропнули её и создали с тем же именем но другим типом.
В чём существенная разница?
Существенная разница в том что в динамических языках тип таскается в памяти в рантайме. Поэтому ты делаешь проверку типа в рантайме. В случае с растом этой инфы в рантайме нет, потому что все проверки делаются статически на этапе компиляции.
Кто что вообще пишет на расте, кроме микросервисов для веба?
Хотел бы для себя что-то написать, но гуи не нужен, игрушку думаю не потяну с 2 фултайм работами, нужно что-то, на что можно полчаса/час в день уделять и чтобы по фану было.
https://bfnightly.bracketproductions.com/
Книжка уже старовата, да и некоторые вещи там хуёво написаны, но если не писать игори, то что вообще писать? Хотя я лично рекомендую Legion, а не Specs. Первый намного круче.
напиши рей трейсер, это не так сложно как кажется на первый взгляд, можно уложится в 1000 строк кода, а как работает каждая функция как раз можешь по пол часа разбирать, вывод можешь в картинку сделать или в гуи если охота с опенгл поебаться, но тогда уже 1к строк не уложишься
> в другом дропнули её
Не дропнули. Дропается она как обычно в конце блока, просто обратиться по имени не получится, но можно сохранить ссылку.
Это тоже однохуйственно. Вот этот анон >>1977321 правильно объяснил: компилятор весь код прочесывает на соответствие типов, и в рантайме все будет статически. Но я бы не стал использовать эту фичу, чтобы себя не наебать. Зачем это нужно вообще не могу понять, код не сокращает, ясности не вносит, но запутать может легко. Наверное я просто в философию не до врубился.
А где есть вот этот реестр официальных но не включенных зависимостей для rust?
>Кто что вообще пишет на расте, кроме микросервисов для веба?
Это толсто или тонко? Объясните.
Трансы пидорасы коммитили в upstream rust'а, значит зашкварили. По понятиям всё, раст - зашкваренный язык. А если ты скачивал офф. релиз на диск, то закшварил ты диск.
Трансы - не пидорасы, а уважаемые арестанты. А ты сам то кто по масти? Junior cuck sucker? Ну так не стесняйся, проходи дальше по треду и под шконарь, уважаемый товарищ петушок.
Как легко ты порвался от безобидной шутки.
Ну так type inference это попытка сделать статическую типизацию такой же лаконичной как динамическая. Так и было задумано. В динамической типизации больше гибкости за счёт меньшей производительности: ты можешь вращать ast прямо во время выполнения, делать eval, получать список переменных в текущем скоупе и прочие приседания которые невозможны/неоправданно сложны в статике.
Кошкодевочки просто хотят разрушить всё что есть в этом мире и построить новый коммунизм, где никто их не будет называть обидными словами. А опенсурс как цель для атаки выбран потому что там безобидные гики-задроты, на которых всем можно нажаловаться чтобы их закрыли. Даже если гиков-задротов закроют, никто не запрещает делать форки и начинать новые организации, libreoffice не даст соврать.
> метапрограмминг на завтипах
Много наметапрограммировал на завтипах? Давай нормальное сравнение со слайдами и почему нам это выгодно, иначе пиздабол простой.
Это лишь твоё мнение. Ты не способен ощутить на себе давление и токсичность всей это sci-fi bro культуры, потому что скорее всего сам являешься её частью. Кошкодевочки хотят сделать программирование доступным для всех желающих, без мобов токсиков-задротов и их ёбаных фюрерков Столманов, Торвальдсов и т.д.
Да чё не способен, сам бывал объектом травли и часто просто за глаза ненавидели лютой ненавистью. Вот только всяких любителей поднасрать админресурсом или травить толпой я ненавижу ещё больше.
Топят то они за правильные идеи, но "преисподняя полна добрыми намерениями, а небеса полны добрыми делами". Тенденцию к мировому тоталитаризму они только усугубляют. Столлман хоть борец против этого самого тоталитаризма. https://www.gnu.org/philosophy/right-to-read.ru.html глянь на год статьи. Кто тогда об этом думал кроме Столлмана?
>Столлман хоть борец против этого самого тоталитаризма.
Это правильная вешь, но "преисподняя полна добрыми намерениями, а небеса полны добрыми делами". Тенденцию к мировому тоталитаризму он только усугубляет.
У него есть куча административного ресурса, политическое лобби, корпаративные юристы, которые зачмырили не одну кошкодевочку?
Столман свободный имакс написал в свое время. Кошкодевочки в основном только судятся, продавливают законы, искушая государство на подавление свободы слова.
>Кошкодевочки хотят сделать программирование доступным для всех желающих
А оно и сейчас доступно, просто кiшкодивчины не хотят собственно программировать, а хотят аппроприировать эту субкультуру, получать 300К\сек и чтобы их в попу целовали
В нем сборщик мусора используется.
V может быть подойдет https://vlang.io/ https://github.com/vlang/v
>Is there garbage collection?
No. V uses memory management techniques from Rust, Swift, and implements its own: vlang.io/docs#memory-management
Сейчас раст советовать еще рановато, а ты V который нестабилен и с багами
Гордиться илитарностью от понимания хуево спроектированного синтаксиса в следствии кривой реализации благой идеи и переучивать либу и синтаксис раз в полгода - это хуже чем уметь трифорсить и троллить этим в б, а нынче это /postcount
Тредов создано: 67.
Тредов просмотрено: 12321.
Постов: 495.
> Гордиться илитарностью от понимания хуево спроектированного синтаксиса в следствии кривой реализации
Ты ошибся, это тред по расту, а не по крестоговну.
Как будто в крестах не так. Выходит новый стандарт раз в три года, считай другой язык вышел, всё теперь надо делать по-другому. Ну ещё заучить талмуд новых undefined behaviour.
Какой дебильный тролль.
Куда попал? Даже ссаные жс и питон регулярно что-то меняют. Если хочешь штабильности, то тебе наверное в лисп, там и синтаксиса толком нет.
lmdb = "0.8.0"
sha1 = "0.6.0"
walkdir = "2.2.9"
clap = "2.33.0"
serde = { version = "1.0.98", features = ["derive"] }
serde_json = "1.0"
rustyline = "5.0.0"
regex = "1.2.0"
lazy_static = "1.3.0"
data-encoding = "2.1.2"
И чёт расхотел переписывать, но раст я ебал в рот, шта делоть?
Пытаюсь собрать самый простой проект из главы или пример из репозитория - и компилятор высирает тонны ошибок из пикрелейтед 2.
Кто-нибудь сталкивался? Всё свежее, сегодня обновлял.
Приведи пример, у меня прост их не было
выглядит так, что есть проблемы со стандартом компилятора, путями инклудов или дефайнами
Ты бы взглянул на первые версии раста, там один в один плюсы с небольшим сахарком. Они и есть цпп-деды, которых заебало. Многое пофиксили, но можно вывезти девушку из C++, но нельзя вывезти С++ из девушки
питонистам
Ало, у нас через точку доступ к полям структуры, ты охуеешь компилятор писать, чтобы разбирался с этими ебаными точками.
Ты не разбираешься в вопросе
Для чего нужен RefCell? Почему не заюзать Arc & Mutex?
Вопросы по AsRef & AsMut - для чего эти конверсии нужны? С виду внутри они ничего не делают. По сути возвращают тот же self.
Спасибо заранее за ответы
>Для чего нужен RefCell? Почему не заюзать Arc & Mutex?
>
Они используют атомики и, внезапно, мьютексы, поэтому без многопоточности только замедляют код.
>>1987705
>Вопросы по AsRef & AsMut - для чего эти конверсии нужны? С виду внутри они ничего не делают. По сути возвращают тот же self.
>
Всякие хаки с дженериками. Например в метод get HashMap<String, i32> можно передать ссылку на слайс, на String или на Cow<str>, и она все проглотит из коробки. Иначе пришлось бы везде писать as_str().
Подобная параша наверное на паре строчек в питоне решается. А да я забыл, раст - это же язык для всяких веб-сервисов и прочей вебной параши.
Про рефселл тебе ответили, а вот про AsRef и AsMut у тебя неверные данные, ибо берётся ссылка на `Self`, а возвращается ссылка на `T`. Например, есть вот такой вот импл:
impl AsRef<[u8]> for str
В итоге в функцию, которая принимает `impl AsRef<[u8]>` ты можешь запихать как слайс байтов, так и строчку.
При этом и этих трейтов есть некоторое различие с Borrow и BorrowMut, но оно скорее философское.
Допустим, есть у меня fn main() {loop{}} с лупом внутри. Внутри которого функции, функции что-то делают. Что можно сделать внутри этих функций, чтобы выскочить? Сначала думал std::process::exit, но
>no destructors on the current stack or any other thread's stack will be run. If a clean shutdown is needed it is recommended to only call this function at a known point where there are no more destructors left to run.
так что не похоже.
Потом попробовал прямо из функции вызвать break; но ожидаемо получил
>cannot `break` outside of a loop
Ещё попытался явно задать, из какого лупа выходить, так что было fn main() {'main: loop {}}, но и это не работает. break 'main; получает >undeclared label `'main`
и тот же
>cannot `break` outside of a loop
Как надо?
fn main() {
loop {
match looped_foo() { Continue => (), Break => break, }
}
}
enum ControlFlow { Continue, Break }
fn looped_foo() { Continue }
Разницы нет, поскольку нет работы. Учишь что нравится.
Тебе бы лучше headless chromium и какой-нибудь puppeteer. Модно асинхронно и с огоньком не везде получится страницы проходить, а уж особенно мокрописьки качать, которые всевозможными способами защищены от автоскачивания.
Я бы вообще запретил либы писать новичку. По крайней мере не выкладывать в паблик какое-то время.
Ну как сложно. Из-за понятного синдрома не сложно. Просто получается хуета в основном.
Пиздец, неужели нет простого способа сделать статический раст-бинарник, не прибегая к изъебствам вроде линковки с собранными из исходников либами (musl, openssl итд)? В go вот заебись сделали, хоть он и параша сам по себе.
Rustup not available. Install from https://www.rustup.rs/
Чё за хуйня?
Rust установлен. cargo bueld/run в консоли работает. Даже прости господи, через аддон для Вима работает. А в этой херне - нет.
Чё за хуйня?
Судя по тому, что ты умничаешь с xinitrc, коренная причина в том, что ты в некотором роде долбоёб. Способов же прострелить себе ногу у тебя масса: ты мог поставить свой кодиум через какую-нибудь контейнерную срань типа snap; ты сидишь под wayland и ему поебать на твой иксовый конфиг; ты мог использовать ~ и переменные в PATH вместо прямых путей... Просто зайди в сеттингс-экстеншенс-раст, задай прямые пути, и не еби анону мозг.
Уточни что тебе нужно. Ты хочешь собрать статический бинарник, но чтобы библиотеки линковались динамически?
Нет, наоборот, я хочу слинковать все библиотеки статически. Чтобы готовому бинарнику не требовалось никакое окружение и его можно было бы использовать в docker-образах, собранных с помощью "FROM scratch". Легко добиться этого невозможно, т.к. растовые бинарники динамически слинкованы с glibc. Ок, можно вместо glibc использовать musl, но в таком случае, если проект использует, например, openssl, zlib, curl, придется еще и их собирать самому и тоже линковать статически. В то время, как в go достаточно, грубо говоря, "-tags netgo" и все заебись работает.
В расте самый мимнимальный подходящий для дефолтной сборки образ - distroless/cc-* от google, но там все равно 20 лишних мегабайт лежит. Хотелось бы и от них избавиться.
Сильное усложнение сборки на ровном месте. На пикрелейтеде мой Dockerfile для сборки (с использованием cc-debian10). А вот так нужно собирать, если нужны статические либки: https://raw.githubusercontent.com/emk/rust-musl-builder/master/Dockerfile, nuff said.
>xinitrc
>.profile
>.bashrc
>.<whatever-sh>rc
Нахуй тебе иксовый rc для установки PATH, ты что, софтварный гомосексуал?
>"-tags netgo" и все заебись работает
Каким образом? В самом трушном гугловом bazel, которым внутри гугла все бинари собирают статически, надо конкретно поебаться, чтобы статически залинковать сишный рантайм. У меня большие сомнения, что go линкует libc статически, ведь смысл внутригугловой политики all build static - в том, чтобы не управлять зависимостями их собственных библиотек, а не в том, чтобы полностью отвязаться от конкретной libc на дистрибутиве. Там и так везде свой унифицированный линукс, собранный и обновляемый из местной монорепы. А собирать все, кроме libc статически умеет и раст, и go, и их же bazel.
>>1997848
Алсо, ровные ребята давно перешли на unikernel, а ты все еще следуешь старинным традициям из 2018г.
distroless/cc-debian10 это оно и есть - so-шки в тех местах, где они должны быть (/usr/lib и прочее). Цель - сделать без so'шек, единый бинарь.
>>1998002
Ты, тащемта, прав, go не линкует (g)libc статически - он вообще не использует (g)libc.
>Go binaries are statically compiled by default.
but if you are using net or os/user, you will get a dynamically compiled executable (linked against libc)
>You will have to provide the netgo and usergo build tags to use the Go-based dns resolver (instead of libc's) and the Go-based function to query the Unix user “database” (instead of libc's).
>Каким образом?
Повторюсь, таким, что собранный из scratch докер-образ с гошным бинарем работает нормально, а с растовым - обсирается (ибо растовый бинарь динамически слинкован с libc, а libc в scratch нет).
>Ты, тащемта, прав, go не линкует (g)libc статически - он вообще не использует (g)libc.
Я нагуглил, что в go мейнстримный рантайм использует свою собственную реализацию для осуществления сисколлов. В rust есть нативные альтернативы libc, но их нельзя назвать мейнстримом, на котором работает подавляющее большинство пакетов. Так что вот така хуйня
Можешь определить макрос вида impl $TypeName { } и вызывать для каждого типа. Это не универсально и крайне херово масштабируется, но работает.
В плюсах от этого бегут как от чумы, а ты тащишь это говно в раст. Ты нормален?
fn foo(t: impl Into<DuckType>) { }
Утиная типизация не нужна, но если очень хочется, то есть варианты. Например, берёшь вот это вот:
https://docs.rs/frunk/0.3.2/frunk/generic/trait.Generic.html
и делаешь вот так вот:
fn foo<G>(g: G)
where
G: Generic<Repr = DuckType::Repr>,
{ let duck: Ducktype = frunk::convert_from(g); }
Но очевидно, что для работы такого дактайпинга тебе надо на все используемые типы задерайвить Generic трейт. Так что на типы из чужих либ ты таким образом дактайпить не сможешь.
Wtf
похуй, пусть учат английский
Раст совсем не тривильный язык когда касается написания грамотного АПИ. И синдромы тут не при чем.
Как я понял const не подчиняется некоторым правилам работы с переменными. (Можно строго сказать что это и не переменная вовсе)
Во многих местах будет просто подставляться полное значение этой константы, также macro_rules! их не санитизирует. В результате можно увидеть приколюхи вроде таких:
https://dtolnay.github.io/rust-quiz/24
https://dtolnay.github.io/rust-quiz/3
Лично мне они были не очевидны.
неявные привязки это плохо, ты в этих макаронах сам запутаешься потом
Я с ноутом в метро 4 остановки проехать не успеваю, как от 100% до нуля батарея падает.
Другие языки с другими компиляторами такой проблемы не имеют.
Компилятор сложный, производит много выводов о типах. Но при этом хорошо оптимизирован так как ругали его за скорость работы.
Вот эти самые оптимизации компилятора научились в т.ч. как следует использовать все возможности процессора, потому и жрет как не в себя.
Он просто ещё сложнее стал, а 2.0 — это не перевыпуск, это из-за брикинг чейнджей ссемвер пришлось апдейтить.
А хрен его знает. Я тогда про пример отсюда это спрашивал: https://doc.rust-lang.org/rust-by-example/error/option_unwrap/map.html
Ошибся, вот https://doc.rust-lang.org/rust-by-example/error/multiple_error_types/option_result.html
Тут вроде делают Result::map(r, Some)
блин, а я вчитываюсь в код ничего не понимаю, уже думал что совсем отупел, лол
энивей спасибо за ссылки
Это копия, сохраненная 5 июня 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.