сложным, хотя если не копаться с лайфтаймами, не создавать структуры ссылок и подобное, он довольно прост, а его правильный синтаксис позволяет избежать странных проблем в языке с динамической типизацией и тем более забыв break в switch, а для начала "скриптинга" достаточно прочитать первые 4 главы растбука.
Некогда я предлагал раст знакомому, и он сказал что его испугало и в чём проблема: подача материала в формате "мы попытаемся сделать это, получим ошибку, и это попробуем, получим ошибку".
Вместо того, что бы изначально изложить правильный путь, а на всякие "тупости формата структура это не итератор" можно просто забить, я даже не представляю, как такое можно написать. Так что может лучше писать по делу, прямо как поваренная книга: как сделать итератор? А вот счётчику с ссылкой на данные надо дать трейт итератор, и всё.
Вот пример.
https://habr.com/ru/post/533204/
Понимаю, что раст хочет показать сразу, какой он мол безопасный, но на деле это лишь пугает новичка. Куда веселее, когда сначала у юзера всё работает и он получает эйфорию, чем "не так, и не сяк, и не вот так, а вот оно очевидное изначально решение".
Это напоминает изучение человеческого языка с грамматики, когда вместо "Hallo, ich bin" на новичка налезают "тут надо точку, а тут надо лицо, вот таблица, а вот нужен падеж, а тут исключение, а вместо ist(есть) надо es gibt(существует), хотя по-детски ist". Уж лучше юзер сначала достигнет уровня А1, а затем будет внедряться в подробности, не случайно школа длится 11 лет, хотя можно сжать до пяти, сразу начав со сложных формул по физике и матана.
И не случайно интернац. языком является английский, а не схожий немецкий(ибо германский) — потому что грамматика для новичка куда проще, хотя уровня С достигнуть уже куда сложнее, чем в немецком — к этому времени ты уже прошел самое сложное.
Раст и есть сложный. Я не знаю у кого какой путь, но я прочитал Rust book и сразу полез на LeetCode делать задачи. Не получается ничего. В Rust Book недостаточно информации, чтобы сделать что-либо сильно сложнее Hello World. Например, написать структуру данных, даже односвязный список, имея только информацию из Rust Book, почти невозможно. Приходится добирать информацию отовсюду, но ее реально мало, крупинки. Книг кроме Rust Book написана ровно одна (заказал неделю как, до сих пор даже не отправили, кроме того, она стоит очень дорого). Вторая - в процессе написания, выйдет весной (Rust In Action). По сети приходится собирать разрозненные куски информации тут и там. Большинство статей и постов про Rust просто невозможно прочитать дальше второго абзаца имея за пазухой только Rust book, начинаешь просто теряться в трех строках кода: "А что это?", "А зачем это?", "А этого в Rust book тоже не было :("
Крупинки? О.о https://github.com/ctjhoa/rust-learning
Ну вот это впервые увидел. Откуда новичку взять такие ссылки?
Закреплено в новичковом чате: https://t.me/rust_beginners_ru/58928
Чот вы какие-то страсти мордасти рассказываете… Если вы не умеете читать информацию и ее запоминать, то вам ничего не поможет. Что значит одного лишь RustBook не хватит, чтобы написать что-то сложнее хелло ворода? Не, если вы из растбука прочли только заглавия, то может быть и да, но блин там же все ясно и понятно описано, было бы желание только читать и запоминать информацию…
Конкретно я говорю, что там недостаточно информации, чтобы писать свои структуры данных.
а можно ссылку на задачку из литкода ту?
Ну как не достаточно, если достаточно, то что вы не смогли это не значит, что информации не достаточно!
Для этого надо поставить научный эксперимент: взять человека не писавшего на Rust, дать ему только Rust Book, и попросить после этого написать самостоятельно список или бинарное дерево или HashMap. Я не гожусь, потому что я уже за пределами Rust Book почитал немного
Задача, на которой я споткнулся, вот: https://leetcode.com/problems/merge-two-sorted-lists/
Вы понимаете что помимо информации есть еще свойство мозга обрабатывать эту информацию?)) Вы можете посадить 2 разных человек написать вот это вот, и один осилит другой нет, так кому верить?))
Ну блин, растбук действительно не рассказывает, как написать вектор.
Статистику уже собрать. Сколько человек смогло, а сколько нет. Мне неприятно признаваться, но я не асилил. Поэтому я хоть и разозлился на Rust, но продолжаю есть кактус, чтобы доказать себе прежде всего, что могу
Дак он и не должен рассказывать как написать все программы мира и все структуры мира))))
Насчет вектора хз, но мне кажется linked list точно можно написать после растбука
Проблема в том что rust это не мейнстрим язык с gc. Дайте человеку 2-4 часа на написание std vector на c++ и такое же время на ArrayList на java
Блин, я в начале года читал, поэтому не помню точно Там по-моему ни одна структура данных не написана
И то и другое я вроде делал, не помню, чтобы были сложности
Не должен. Но, кажется, ты пошел обвинять ОП в том, что он невнимательно читал растбук.
А двунаправленный?
Насколько я помню, растбук вообще не рассказывает, как память аллоцировать. А нормальный двусвязный список на примитивах их std не построишь.
а чо, есть C++Book, который можно дать, и вектор на темплейтах изобразят?
Я давно не читал ничего по C++ Но после Страуструпа можно, по-моему. И вообще, по C++ просто вагон информации для любого уровня, на любом языке, в любом стиле подачи Понятно, что и язык дольше существует, конечно
По оглавлению не видно. Покажешь, где?
Я не помню точно, говорю же, что читал в начале года Но это Box - а Box там точно описывается
https://doc.rust-lang.org/book/ch15-01-box.html
хм. интересный сценарий. Наверно трудности связаны с тем, что LeetCode изначально ориентирован на ЯП вроде C++, Java, где проблема указателей не решена синтаксически(В плюсах никак, в жабе GC). А как только вы получаете "простое" задание со списком, то вы сразу касаетесь сырых указателей, которые в расте — высший пилотаж. Ибо список — базовая структура данных, основанная на ансейфе и предположениях. А так, для списка вам понадобится его элементы поместить в контейнер, у которого есть два умных указателя(Rc) на следующий и предыдущий контейнеры, причём следующий может отсуствовать, поэтому он должен быть Option, При этом контейнеры выстраиваются в цепочку слева-направо, поэтому предыдущий контейнер владеет следующим(Rc), а следующий лишь знает предыдущего исключительно для операции вставки, поэтому тут слабый указатель Weak. Увы, но будет счётчик ссылок, но это безопасный вариант, можно отказаться от счётчика ссылок, и вместо умных указателей заюзать сырые, опасные, и тут начинается ансейф. Код контейнера простой: struct Node<T> { element:T, prev: Option<Weak<Node<T> > >,//предыдущий контейнер может не существовать, но мы его знаем next: Option<Rc<Node<T> > >//следующий может не существовать, но мы им владеем } Для упрощения можно аналогично typedef в С. type NextPtr<T> = Rc<Node<T> >; type PrevPtr<T> = Weak<Node<T> >; Ну и сама структура списка, с которой юзер работает, должна владеть первым контейнером, тем самым владея и последующими struct List<T> { first: NextPtr<T>, last: NextPtr<T> } Ну а далее в impl надо написать методы. —————— Для меня в начале было тоже тяжело — захотел сделать лабу на расте со строками. И то, что на С я бы сделал за 30 минут, на расте ушло 6 часов, зато какие строки! &str, которые ссылаются на часть строки, вместо её копирования(что в С трудно из-за вынужденного нуля, который затрёт следующую букву), с юникодом вместо извращений ну и подобное. Так что может вам стоит начать с чего-то простого вроде пересечения отрезков и не юзания структур данных вместо их реализации, т.е. реализации практических задач?
Просто вы писали что на это надо 2-4 часа. Думаю вы погорячись с оценкой с 0 до std vector за такой срок :)
Наверное невнимательно прочитал, да, за 2-4 часа не получится, но для неновичка в программировании, всё равно будет быстрее, чем на Rust, мне кажется
Ну я вот и подумал, что сначала надо потренироваться на чем-то В Rust Book упражнений нет Посмотрел, на LeetCode можно вроде на Rust писать Решил одну задачку с трудом, вторую, третью, а потом как на списки попал, так попал ))
Признайтесь, вы просто влюбились в Rust 🥰 И не потому продолжаете на Rust писать, что он сложный, а что с его сложностью разобраться по силу, другой вопрос, что он дает много плюшек, которые не дает ни один другой язык 😊
так ни одна книга по С++ тоже
Ну, не знаю. Для начала я жду книгу от O'Reilly, надеюсь, придёт до новогодних каникул. Вроде годная книга, как говорят. Просто появился азарт: "Чем я хуже остальных, другие смогли, и я должен смочь еще лучше" Хочется преодолеть эти трудности и начать щелкать структуры данных как орешки на Rust
вся "любовь" пропадает, как только встречается сложная тема с лайфтамами
Ну вообще да. А в курсах это вроде как встречается.
у раста тоже был где-то курс по структурам данных
(По крайней мере таков мой (небольшой) опыт)
ну я тоже на свой опыт опираюсь и единственное полное описание той же мапы было во втором томе страуструпа
Ну если с лайфтаймами не разобраться, то конечно любовь пропадет, любая любовь о бытовуху разбивается, если заранее не обсудить какие-то вещи)))
для того, чтобы разобраться со сложными случаями, нужна документация, плюс, в самом языке ещё не реализованые какие-либо фичи, типа GAT
причём если вы сделаете список на сырых указателях, у вас по сути выйдет то же, что на С++ и раст вам не поможет. Ибо структуры данных — это ансейф базис, базирующийся только на предположении, что он работает идеально. Зато 99% прикладного кода сейф, и он может сгенерировать гейзенбаг только если есть ошибка в 1% кода. И в том и фича, что в случае такой ошибки вы сканируете только этот один процент, а не 100% кода как в С++, и именно на этот процент вы натравливаете тестировщиков и самые опытные кадры, а остальные 99% как правило "если компилится, значит работает", за исключением логических ошибок в сложных библиотеках, формирующих, например, математический базис или интерфейс к БД. Поэтому фичи раста проявляются на прикладном уровне, и вам стоит начинать именно с него.
лайфтаймы это высший пилотаж и зачастую юзаются для оптимизации. Вот многие ЯП, не имеющие эту фишку, обходятся счётчиком ссылок и GC, но производительность страдает. Так что этот уровень скорее для самых опытных. и для оптимизаций. А преждевременные оптимизации, как говорится, корень зла, да к тому же этот код может быть выпелен за ненадобностью. Да к тому же иногда для, например, std::mem::swap двух элементов массива/вектора, приходится обманывать компилятор при помощи указателей, ибо нарушается упрощенная концепция владения, что мол мы свопим вектор на вектор, а не элемент на элемент, причём компилятор точно знает, что это разны элементы(разные индексы).
"лайфтаймы это высший пилотаж и зачастую юзаются для оптимизации" для сложных случаев компилятор rust сам не может лайфтаймы расставить
ну сложные случаи потому и сложные, что высший пилотаж =)) А так, без лайфтаймов можно выжить, но будет аналог Java или скриптового языка, только на Rc<RefCell<> >
что-то сомневаюсь, что без лайфтаймов можно выжить
"не может" либо потому что вариантов больше одного, либо потому что вариантов ноль, то есть в коде противоречие Что с этим не так?
у меня есть случай, когда ссылки последовательно ссылались на следующие 3 раза, создавая некий паровоз. Зато это гарантировало то, что когда мы работаем с объектом снаружи, объект глубоко внутри будет жить. Вот это пилотаж был, да.
может имелось ввиду ссылки на ссылки и структура ссылок, где надо указывать явно?
Если этой книги еще нет в закрепе, то у меня вопросы к админам: https://github.com/Dhghomon/easy_rust
Обсуждают сегодня