Ветка исследования rust

Обновлено: 28.04.2024

Перед вами краткое профессиональное описание особенностей языка Rust для профессионалов.

  • краткое — информации будет гораздо меньше, чем в Книге (The Rust Programming Language)
  • профессиональное — информации будет гораздо больше, чем в Книге;
  • описание особенностей — фокусируемся на отличиях Rust от других языков;
  • языка — описывается именно язык, а не установка средств разработки, управление пакетами и прочий инструментарий;
  • для профессионалов — подразумевается, что читатель имеет существенный опыт в разработке ПО.

Чего здесь НЕ будет

  • Не будет агитации за Rust
  • Не будет легко. Для освоения потребуется неделя-другая вдумчивого чтения по часу в день, с тщательным разбором примеров, как-то так

Моя история изучения языка Rust началась со статьи Как мы ржавели. История внедрения и обучения. В ней Nurked предложил оригинальный способ прочтения Книги — читать главы надо не по порядку, а в последовательности [4, 3, 5, 6, 8, 4, 9, 7, 10, 4, 13, 17, 15, 16]. Со многими тезисами этой статьи я склонен в той или иной степени согласиться, в частности, с тем, что "первая глава этого руководства должна гореть в печи". Конечно же, вместе со второй, в которой разбирается вот этот пример:

Именно на этом примере я в свое время закрыл Книгу — неинтересно. К тому же, за println!(. ) явно скрывается некий макроязык, а к ним у меня стойкая аллергия со времен работы с Microsoft Foundation Class. Ну, в общем — нет, спасибо, не надо.

После повторной подачи от Nurked начал с главы 4 и появился интерес. Как пишут сами авторы Книги:

Владение является наиболее уникальной особенностью языка Rust. Благодаря ей в Rust осуществляется безопасная работа с памятью без необходимости использования автоматической системы сборки мусора (garbage collector).

С этого и надо было начинать. Я отношусь к той категории людей, которые несколько измучены нарзаном недовольны нюансами работы с GC в рамках highload, засим текст нашел внимательного читателя в моем лице. В процессе чтения главы 4 я обнаружил, что Книга рассчитана на совсем новичков и переполнена скучными подробностями, поэтому изначально у меня была идея просто законспектировать суть, отсекая все лишнее. Но эта идея потерпела крах, так как оказалось, что для понимания принципов работы с памятью после главы 4 надо читать главу 10.3, потом главу 15, при этом текста много, он содержит ошибки и его совершенно недостаточно. Для понимания пришлось дополнительно читать, например, это, это, это, это и вот это, но нужных мне примеров я так и не нашел.

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

Читатель должен владеть на уровне middle+ двумя языками программирования (один с GC, один без него), они послужат донорами абстракций, которые в тексте не поясняются.

Из тех языков, с которыми я плотно работал, Rust ближе всего, КМК, к Go. Их роднит отсутствие "нормального ООП", отсутствие "нормальных исключений", концепция срезов (slice), наличие как объектов, так и ссылок/указателей на них, возможность возвращать несколько значений из функций, страшное слово unsafe, ну и, конечно, кросс-компиляция "из коробки". В Go пока нет обобщенных типов, но про них знают и их ждут, поэтому опытного гофера ржавчиной не испугать.

Что делать, если знаешь только один язык? План Б.

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

Когда объект покидает область видимости (variable scope), его "финализируют" через вызов метода drop(). В этом деструкторе можно произвести некие завершающие действия — возвратить память в кучу, закрыть соединение и т.д. Для примера создадим экземпляр типа String с помощью конструктора фабрики String::from() :

String хранит свои данные в куче, и компилятор Rust любезно обеспечит неявный вызов s.drop() после закрывающей скобки, тем самым давая возможность вернуть использованную память.

"Книга" утверждает, что управление памятью осуществляется через "владение" с набором правил, которые компилятор проверяет во время компиляции программы. Полезно сразу иметь в виду (напомню — материал для опытных камикадзе), что есть некие:

  • Box для распределения значений в куче (памяти)
  • Rc тип счётчика ссылок, который допускает множественное владение
  • Типы Ref и RefMut , доступ к которым осуществляется через тип RefCell , который обеспечивает правила заимствования во время выполнения, вместо времени компиляции
  • Rust допускает утечки памяти, используя типы Rc и RefCel можно создавать связи, где элементы ссылаются друг на друга в цикле

Иными словами, если память выделяется в куче, а полученные объекты ссылаются друг на друга — будь готов к граблям, засадам и к поиску утечек памяти.

  • immutable_string , ого, змеиная нотация — так надо
  • Переменные, объявленные через let , изменять нельзя
  • Если надо менять используем let mut
  • Вывод на печать осуществляется причудливой конструкцией dbg! (тут может возникнуть справедливое подозрение, что это не "обычная функция")

Я думаю, Rust имеет потенциал находить отклик в сердцах многих. let как в Бейсике, <> как в Java, :: как в С++, объявление функции похоже на таковое из Go (только там func )

Ключевое правило: Каждое значение имеет одного и только одного владельца-переменную

После операции присваивания переменная типа String перестает владеть своим бывшим значением, и ее нельзя больше использовать:

Для простых типов (primitive types), однако, значение копируется, а не передается, и для них многократное присваивание выглядит обычным образом:

  • Есть trait (как бы interface) Copy , если тип его реализует, при присваивании/передаче в функцию/возврате значения происходит копирование
  • Copy реализован для простых скалярных типов, а также для неких кортежей (tuples), при условии, что эти загадочные пока tuples содержат только типы, реализующие Copy
  • Тип String не реализует Copy
  • Из неочевидного: Copy несовместим с Drop (это где drop() ). Несовместим, даже если не сам тип, а только его некоторые части реализуют Drop

При передаче переменной в функцию по значению происходит и передача владения (если тип не реализует интерфейс trait Copy ):

  • Из функции можно вернуть несколько значений (тот самый кортеж, или tuple ) означает целый беззнаковый тип, который вмещает указатель (the pointer-sized unsigned integer type)
  • return можно не писать
  • При возврате переменной "по значению" функция возвращает и владение
  • Полезное макро dbg! "съедает" параметры (то самое move), чтобы этого избежать можно использовать ссылки: dbg!(&s1, length)

Необязательно брать значение во владение, его можно "занять" (borrow):

  • Занять можно как для чтения ( & ), так и для записи ( &mut )
  • Занять для чтения (immutable borrow) можно сколько угодно раз в "области видимости переменной" (variable scope)
  • Занять для записи (mutable borrow) — только один раз
  • Нельзя занимать одновременно для чтения и записи (все это похоже на read/write locks)
  • Результат заимствования называется ссылкой (reference)

От перестановки строк из примера выше результат меняется, можно раскомментировать строки и все будет работать:

  • Здесь вроде как одновременно существуют две ссылки на чтение и одна на запись, но r1 и r2 после вывода на печать больше не используются, так что активных ссылок на момент let r3 =. — нет

Компилятор Rust гарантирует, что эта проблема искоренена полностью. Рассмотрим такой пример:

Здесь мы заводим локальную переменную и затем возвращаем ссылку на нее. Что, конечно, очень плохо, так как переменной и ее значения после возврата из функции больше нет, а ссылка на несуществующее — есть.

Компилятор откажется работать в таких условиях, в качестве причины отказа он приведет загадочную формулировку: "error[E0106]: missing lifetime specifier". Загадка lifetime specifier получит раскрытие в следующих главах.

В свое время был удивлен, что в Go таки можно вернуть указатель на локальную переменную, и за это тебе ничего не будет:

На деле хитрый компилятор в этом случае выделяет память в куче:

  • Срезы строк можно делать только по труъ-unicode-границам, иначе паника
  • Подробнее тут или here, кому что любо

Но то строки, с байтами ситуация попроще:

Теперь, собственно, про владение. Взятие среза "одалживает" всю последовательность на чтение, менять ее теперь нельзя:

Изучение играет ключевую роль в игре Rust – если на ранних этапах можно обойтись и примитивными предметами, что обусловлено отсутствием различных материалов у игрока, на более поздних этапах развития уже желательно переходить на более продвинутое снаряжение – без хорошей винтовки и более-менее прочной брони будет трудно противостоять противнику.

Обновление от 3 декабря 2020 года несло скорее исправительный характер – это обновление не привнесло в игру ничего нового. Даже если проанализировать change-list №236 от 03/12/2020, можно заметить, что обновление состоит из малого количества исправлений, а большую же часть составляют доработки и незначительные. Хотя разработчики предоставили 1 нововведение, что, кстати говоря, можно отнести к доработкам – теперь в игре абсолютно новая система исследования предметов с использованием верстаков. Встречайте древо технологий!

Чем отличается от прошлой

Различия в системах колоссальные – если раньше всё было завязано на элементе рандома, то есть игрок вкладывал определённую сумму металлолома, которая была уникальна для каждого из верстаков, а после эксперимента получал случайный неизученный предмет из данного верстака, то теперь игрок заранее понимает, какой предмет он получит. Но при этом теперь количество металлолома, которое придётся потратить на открытие заблокированного предмета, напрямую зависит от этого самого предмета.

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

Верстак второго уровня

cost


Потрачено металлолома: 0 / 10415
Изучено:

Верстак третьего уровня

Как изучаются предметы в древе изучений

Начальные предметы, которые доступны

Первым делом при изучении предметов с использованием древа изучений необходимо разблокировать начальные предметы.

На верстаке первого уровня изначально доступны для разблокировки 4 предмета: самодельный молот, майка, ведро и переключатель.

Верстак второго уровня изначально позволяет разблокировать всего 2 предмета: антирадиационный костюм и длинный меч.

Всего 1 предмет доступен для изначального изучения на верстаке третьего уровня – укреплённая оконная решётка.

Дальнейшие ветки и стоимость изучений всех предметов

Верстак первого уровня

Верстак второго уровня

Название предмета Стоимость изучения (металлолом)
RAND-переключатель 20
Умный переключатель 20
Перчатки из дорожных знаков 20
Катушка Тесла 20
Радиоприемник 20
Радиопередатчик 20
Дистанционный пульт 20
Пейджер 20
Металлическая горизонтальная бойница 20
Металлическая вертикальная бойница 20
Бетонная баррикада 20
Длинный меч 75
Граната F1 75
Дробь 12-го калибра 75
Пуля 12-го калибра 75
Зажигательный снаряд 12-го калибра 75
Большая аптечка 75
Медицинский шприц 75
Ботинки 75
Броня из дорожных знаков 75
Шлем из кофейной банки 75
Средний аккумулятор 75
Счетчик 75
HBHF-датчик 75
Поисковый фонарь 75
Большой аккумулятор 75
Шкаф для переодевания 75
Малый НПЗ 75
Большой водосборник 75
Малый генератор 75
Ячейка памяти 75
Умная сигнализация 75
Лазерный датчик 75
Счетчик ресурсов 75
Дымовая граната 75
Электроочиститель воды 75
Водяной насос 75
Зенитная управляемая ракета 75
Толстовка с капюшоном 75
Килт из дорожных знаков 75
Подковы высокого качества 75
Компьютерная станция 75
Тюремная дверь 75
Тюремная решетка 75
Усиленное стеклянное окно 75
Гаражная дверь 75
Антирадиационный костюм 125
Самодельный топор 125
Самодельный ледоруб 125
Револьвер Питон 125
Помповый дробовик 125
Мина 125
Полуавтоматический пистолет 125
Огнемет 125
Пистолетный патрон (скоростной) 125
Зажигательный пистолетный патрон 125
Тяжелый латный нагрудник 125
Тяжелые пуленепробиваемые поножи 125
Большая печь 125
Поршни среднего качества 125
Свеча зажигания среднего качества 125
Клапаны среднего качества 125
Карбюратор среднего качества 125
Коленчатый вал среднего качества 125
Модуль кабины транспорта 125
Модуль двигателя автомобиля 125
Модуль задних сидений 125
Модуль двигателя транспорта 125
Модуль такси 125
Топливный бак 125
Модуль для большого грузовика 125
Пассажирский модуль 125
Кабина с двигателем 125
Пассажирский модуль 125
Подъемник для транспорта 125
Ветрогенератор 125
Лифт 125
Бензопила 125
Дульный ускоритель 125
Дульный тормоз 125
Пистолет-пулемет Томпсона 125
Самодельный пистолет-пулемет 125
Патрон 5.56-мм 125
Полуавтоматическая винтовка 125
Голографический прицел 125
Ракета (скоростная) 125
Ракета (зажигательная) 125
Тяжелый пуленепробиваемый шлем 125
Конная броня из дорожных знаков 125
Очки ночного видения 125
Лестничный люк 125
Металлическая баррикада 125
Треугольный люк 125
Высокая внешняя каменная стена 500
Ракетница 500
Высокие внешние каменные ворота 500
Автоматическая турель 500

Верстак третьего уровня

Название предмета Стоимость изучения (металлолом)
Укрепленное стеклянное окно 125
MP5A4 125
Лазерный прицел 125
Патрон 5.56-мм (скоростной) 125
Ракета 125
Клапаны высокого качества 125
Поршни высокого качества 125
Коленчатый вал высокого качества 125
Карбюратор высокого качества 125
Свеча зажигания высокого качества 125
Патрон 5.56-мм (зажигательный) 125
Патрон 5.56-мм (разрывной) 125
Бронированный модуль 125
Бронированный пассажирский модуль 125
Прицел 8х 125
Бронированная дверь 500
Двойная бронированная дверь 500
Железная маска 500
Металлический нагрудник 500
Взрывчатое вещество 500
Взрывчатка с таймером 500
Штурмовая винтовка 500
Винтовка 500

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

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

Только исследование

cost


Чертежи которые можно получить только с помощью исследования.
Потрачено металлолома: 0 / 795
Изучено:

SHADA1347

ЗАЧЕМ ОН НУЖЕН ?
Благодаря этому предмету игрок с легкостью может изучить много рецептов крафта. По сути, это тот же чертеж, по которому становится доступным изучение и создание найденных в поисках предметов. Заняться исследованием предмета можно лишь около Workbench (верстак). Если стоять далеко от рабочего стола, то ничего не получится.

ГДЕ НАЙТИ ?
Найти Research Kit в RUST можно у зараженных волков и медведей или же в деревянных ящиках, которых так много в городах. Других мест, где мог бы находиться этот предмет, мизерное количество.

КАК ИСПОЛЬЗОВАТЬ Research KitВ ИГРЕ ?
Что же, давайте теперь разберемся, как использовать Research Kit в RUST. Для начала стоит раздобыть желаемый предмет, чтобы затем получить возможность исследовать его и создавать для своих целей. В качестве примера подойдёт любое огнестрельное оружие. Нужно переместить иконку комплекта исследования на оружие, и оно появится в списке возможных предметов для создания.

КАК ИЗУЧИТЬ ?
Сам Research Kit изучить можно без особых усилий. Чтобы провести подобное действие, необходимо предварительно запастись двумя образцами комплекта и перетащить один на другой с зажатой клавишей Shift.

Спавн лодок и лошадей

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

Верстак первого уровня

cost


Потрачено металлолома: 0 / 4535
Изучено:

Верстак второго уровня

Верстак третьего уровня

cost


Потрачено металлолома: 0 / 5350
Изучено:

Стол для исследований

Древо технологий Rust: обзор системы

Система древа технологий в Rust – это полностью переработанная система изучения предметов на верстаках в Расте, которая ранее была более известна как эксперименты. Сейчас от такой системы отказались в пользу использования древа технологий, в которой игрок заранее видит, что он будет открывать.

Переработка эйрдропа

Эйрдропы в игре не изменялись аж с 2013 года. Сейчас его внешний вид полностью переработан, подогнанный под стандарты Раста 2020 года.

Система появления лута в эйрдропах также была изменена. Теперь вы гарантированно найдёте в эйрдропе хорошую броню в количестве 2 штук, а также 1 или 2 ствола. Никаких деревянных доспехов, мечей, мин и прочего.

Обновлённый эйрдроп в Rust

Обновлённый эйрдроп

Ветка исследований

Старая система исследований, введённая в игру ещё в ноябре 2017 года, была полностью обновлена. Изменения коснулись исключительно исследований на верстаках. Теперь нет никакого элемента рандома, как это было ранее. Сейчас игрок самостоятельно разблокирует ветку исследований у каждого отдельного игрока, а каждый предмет требует своё количество металлолома на изучение.

Игрокам по-прежнему можно игнорировать исследования на верстаках, пользуясь исключительно столом для исследований.

Ветка исследований в Rust

Ветка исследований

Читайте также: