LINUX.ORG.RU

Нубских вопросов по Rust'у тред

 , , ,


1

4

Привет, ЛОР. Сразу попрошу камнями не кидаться, ибо за плечами 5 лет Java разработки, возможно она и накладывает такой отпечаток на восприятие нового языка. Энивей, ближе к делу. Читаю их оффициальную книгу и есть там такой пример

fn main() {
    println!("Guess the number!");

    println!("Please input your guess.");

    let mut guess = String::new();

    io::stdin().read_line(&mut guess)
        .expect("Failed to read line");

    println!("You guessed: {}", guess);
}
И мне взрывает мозг конструкция с mut, точнее я вроде как это прекрасно понял (но хочу убедиться что понял правильно, потому и пишу), + в книге дикая путаница в важных вещах, которые еще и обзываются по разному (binding, variable, reference).

Как я это вижу:

let mut guess = String::new();
На языке джависта «Создаёт мутабельную ссылку на мутабельный объект». Т.е. меняться может как то, куда она указывает, так и объект, на который она указывает (можно вызвать guess.push('c');, например)

let guess = String::new();

Это же звучит как «Создает иммутабельную ссылку на иммутабельный объект», т.е. нельзя поменять то, куда она указывает, равно как и значение по ней (нельзя вызвать guess.push('c');)

let guess = &mut String::new();

А вот это просто вишенка на торте, а может быть и сам торт. Создаёт иммутабельную ссылку на мутабельный объект. Т.е. мы не можем поменять то, куда оно указывает, но можем изменять значение (вызовом того же guess.push('c');) Если описывать последнее терминами раста, то создаёт иммутабельный биндинг на мутабельную ссылку.

И если я понял это правильно, то у меня вопрос, почему в примере книги написано вот так?

    let mut guess = String::new();

    io::stdin().read_line(&mut guess)
        .expect("Failed to read line");

Ибо мне как джависту очень хочется написать вот так

    let guess = &mut String::new();

    io::stdin().read_line(guess)
        .expect("Failed to read line");
Т.е. биндинг сам по себе иммутабелен и всегда указывает на одну ссылку, а ссылка мутабельна и её содержимое может меняться. Вот, дискасс, если я что-то упустил или не понял - поясните пожалуйста.

★★★★

Последнее исправление: Jefail (всего исправлений: 1)
Ответ на: комментарий от dave

Никогда gcc не плёлся - это маздайская пропаганда. Маздайское говно всегда было говном.

На самом деле здесь ничего не поменялось. Маздайские адепты до сих пор там тебе насравнивают так как раньше. Схема проста - берётся какой-то гцц древний гцц, маздайщик не знает о флажках и вообще не и о чём. Он знает только как долбить кнопку в гуйне.

Вот так и рождались все эти куллсравнения, да и рождаются сейчас. К тому же под маздаем сравнивать в принципе ничего нельзя. Как можно понять - дерьмо там не только «компилятор».

Что-то мог противопоставить гцц только шланг, там они так же начали хайпить по методичке раста(неужели кто-то думал, что методичка у раст-адептов новая и своя? Нет).

Точно так же рассказывали про супер-качество ошибок, про скорость компиляции. Правда вся эта скорость компиляции куда-то пропала, когда шланг/llvm начал что-то мочь, а не попросту генерировать говно. Тоже самое касается ошибок.

И теперь шланг стагнирует уже несколько лет. Можно на живом примере убедиться к чему приводит мусорный хайп и пропаганда. Ведь зачем что-то сделать, когда можно сектантов убедить в чём угодно?

Там вон до сих пор сектанты бегают и рассказывают, что шланг быстрее собирает и про какие-то там ошибки.

freddie_sadler
()
Ответ на: комментарий от RazrFalcon

Я опять же, не знаю как мои «вьетнамские флешбеки» связаны с тобою, но меня опять накрыло. Помню, помню этих сектантов, помню этих qt-макак, которые ничего не могут, не знают, но бежали. Они бежали в своей бездарности - бежали и всё засирали. Своей бездарностью и мусорными потугами. Помню.

llvm/clang +/- на том же уровне.

Чушь.

Ну и архитектурно он лучше

Нет.

поэтому все плавно перелазят на него.

Нет.

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

freddie_sadler
()
Ответ на: комментарий от freddie_sadler

Тем не менее, лет семь назад я не мог распарсить одно сообщение об ошибке, которое мне выдало gcc. Там что-то с вложенными шаблонами было или типа того, я уже забыл. Так вот, прогнал через clang, и он мне так четко объяснил, где я был не прав. До сих пор вот это помню.

dave ★★★★★
()
Ответ на: комментарий от dave

Очевидно, что бывают кейсы которые в каком-то случае лучше. Допустим - всякие там подсказки уровня «ты не вставил template/typename». Все подобные истории в основном связаны с этим.

И я чётко указал, что действительно шланг обладал большей производительностью и лучшими ошибками, но было до следующего релиза гцц.

К тому же, тут есть один нюанс о котором постоянно все забывают. В том же видео адепт обделался в том, что он сравнивает последний шланг и восьмой гцц, когда тогда уже был 9.

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

freddie_sadler
()
Ответ на: комментарий от freddie_sadler

Ну, да, мне там надо было дописать typename и еще что-то. Недописал. В этом была ошибка.

Видео посмотреть пока не могу. Времени нет.

dave ★★★★★
()
Ответ на: комментарий от dave

Ну, да, мне там надо было дописать typename и еще что-то. Недописал. В этом была ошибка.

А когда будет реальные, сложные ошибки. Эта дристня будет тебе спамить мусором. Как только я встречаю сложную ошибку, которую я сходу не могу понять - шланг мне никогда не помогает. Возможно в каких-то крайне редких случаях.

Вот тебе типичный пример:

//вот контекст генерируемый шлангом
instantiation of function template specialization 'boost::hana::make_impl<boost::hana::range_tag, void>::apply<boost::hana::integral_constant<long long, 0>, int>'

in instantiation of function template specialization 'boost::hana::make_t<boost::hana::range_tag>::operator()<boost::hana::integral_constant<long long, 0>, int>

//вот гцц.
In instantiation of 'static constexpr auto boost::hana::make_impl<boost::hana::range_tag>::apply(const From&, const To&) [with From = boost::hana::integral_constant<long long int, 0>; To = int]':
required from 'constexpr decltype(auto) boost::hana::make_t<Tag>::operator()(X&& ...) const [with X = {boost::hana::integral_constant<long long int, 0>, int}; Tag = boost::hana::range_tag]

Как видишь - он даёт нормальный контекст, а не говно. А контекст в С++ - это главное. Он мне пишет не тупую сигнатуру. Он показывает полную сигнатуру, аргументы, параметры шаблоны и их значения. https://godbolt.org/z/xwMJVs - кейс.

Здесь можно заметить единственное, в чём может шланг выиграть - он трейсит глубже. Хотя я никогда проблем с глубиной трейсинга в гцц не имел, но авось где-то это всплывёт. И это тоже проблема. В основном я глазами могу потрейсить, и в основном мне нужно не то место, где оно отвалилось. А то место, где «было нормально, а потом пошло по жопе».

Видео посмотреть пока не могу. Времени нет.

Там нужно посмотреть минуты две. Там будет панчлайн. Остальное смотреть не обязательно.

freddie_sadler
()
Ответ на: комментарий от freddie_sadler

Я помню на какой-то презентации clang, там показывали пару примеров где clang лучше gcc, сейчас набил эти примеры, в 9 gcc второй пример почти сравнялся с clang, в первом до сих пор clang генерирует код лучше

https://gcc.godbolt.org/z/h1J-A5

https://gcc.godbolt.org/z/q5zvOG

Хотя наверное это можно отнести к

Причём именно для дерьма он настроен по умолчанию лучше.

Но вообще первый пример впечатляет что делают компиляторы, меняют асимктотику с O(n) до O(1). Прям ИИ, который знает про арифметическую прогрессию.

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Хотя наверное это можно отнести к

Это можно отнести к «поимела пропаганда».

9 gcc второй пример почти сравнялся

Неверно - xor бесплатен. К тому же - нужно смотреть семантику попкаунта, авось это имеет смысл.

Но вообще первый пример впечатляет что делают компиляторы, меняют асимктотику с O(n) до O(1). Прям ИИ, который знает про арифметическую прогрессию.

Очень сильно поимела.

Я тебе расскажу как это делается. Берёт какой-то школяр любую херню(типа той, что «первый пример»), в пиливает туда эту оптимизацию говна(очевидно, что она говно нелепое - так никто делать не будет, очевидно). Подобная оптимизация говна делается за вечер-два.

Далее он идёт на презентацию и впаривает тебе это дерьмо. Ты его сожрал - тебя поимела пропаганда.

Причём заметим. Кейс с popcntl имеет смысл. Существует много говнокода в котором это считается руками и в гцц это добавили. Смысла же первый пример не имеет.

Все эти оптимизации с реплейсом - самая примитивная херня. Они ничего не стоят и нахрен ненужны.

anonymous
()
Ответ на: комментарий от RazrFalcon

Как оно внутри устроенно - я хз.

Других адептов раста у меня для вас, к сожалению, нет.

anonymous
()
Ответ на: комментарий от anonymous

Неверно

Манявры пошли.

Берёт какой-то школяр любую херню

То-ли дело гцц! Вот возьмёт его школяр, откроет рандомный файл на 40к строк кода, потом откроет соседний, ещё на 30к строк кода и уже на другом ЯП и с другим стилем оформления кода, подумает «вот диды-то умели!» и точно ничего не сделает.

Они ничего не стоят и нахрен ненужны.

Зачем компиляторы используешь? На форте пиши, как диды, хипстер чтоли?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.