Rust (legacy)

Code-assistant rust-analyzer отлично работает с шаблонами

В последнее время я оборачиваю небезопасные библиотеки языка С, чтобы подцепиться к каноническому Rust API. Если бы сразу начал писать на «плюсах», уже давно бы закончил и общался с железом, к которому эта библиотека поставляется. А так как пишу на Rust, то пришлось целую неделю аккуратно оборачивать код в канонические Rust-структуры. Столкнулся с тонкостями системы типов: вариантностью ссылок, контравариантностью типов. Если не обращать на них внимания, то safe-обёртка над C API будет некорректной.

Оборачивать низкоуровневый unsafe-код в safe на Rust довольно долго, но оно того стоит. «Плюсовой» IntelliSense вряд ли сравнится с мощным rust-analyzer и справится далеко не со всем кодом, особенно с шаблонами.

Неизменяемость

В функциональных языках приходится много работать с неизменяемыми структурами. JavaScript программистов никто не заставляет работать с неизменяемостью, но популярные библиотеки, такие как Redux и Immutable.js, научили нас это делать. Сегодня есть ключевые слова и для объявления изменяемых и неизменяемых переменных соответственно.

На Rust для объявления переменных мы будем использовать лишь только , причём переменные эти будут неизменяемы по умолчанию. Если мы захотим использовать изменяемые данные, нам придётся добавить ключевое слово в объявление:

fn main() {    let a = 42;    let mut b = 1;    a = 43; // ОШИБКА: a - неизменяемая    b = 2;}

Несколько советов

Во-первых, с самого начала игры займитесь распределением обязанностей в своей команде. Это серьёзно повысит её эффективность. Один-два опытных охотника, человек, который изучает все необходимое и т.д. То же касается и использования оружия. Допустим, у вас есть М4, и один член команды не умеет пользоваться автоматическим оружием. Пусть возьмёт пистолет, а впоследствии, в процессе развития, болт. Лучше иметь в команде пару снайперов, пользу от которых вы сразу же ощутите во время рейдов. В дополнение ко всему, легче привыкнуть к какому-либо одному оружию.

Во-вторых, строя дом, используйте всевозможные уловки, чтобы было невозможно пробраться внутрь (например — попадание в дом только путём самоубийства и последующего возрождения через кровать).

Опасайтесь игроков, но постарайтесь завести себе компаньонов. Пара лишних людей всегда будет полезной во время рейда.

ИГРА В ОДИНОЧКУ

Если вы играете в одиночку, то это не беда. В одиночку лучше играть на серверах с установленными модификациями на ускоренную добычу ресурсов и моментальное создание вещей.

Placing Structures

Valid building placement

Invalid building placement

To place a structure, a Building Plan must be crafted. Building plans costs 50 Wood. When the Building Plan is crafted, place it in the hotbar and select it. By default, the foundation object is selected, and you will see a «ghost» of it as you look around. To select other building objects, hold right mouse button, move your mouse in a circle to the object you want, and left click. To begin building, choose either a foundation or a triangular foundation, look at an area suitable for a house, and left click. This will create a foundation. To place walls, select them and aim at the edge of a foundation. Floors must be placed at the top edge of a wall, and doors must be placed inside door frames. Be careful, because as you build up, you have to keep track of the building’s stability. If too many floors are built too far away from a wall, it will collapse.

Shelter

After you have gathered: 5 stone, 40+ wood (I prefer 85+ so you can build a shelter), you are ready to start your ‘life’. In my mind, the hardest part is finding the initial 5 rocks to give you the stone that you need in order to make a stone hatchet. Use the 5 stone that you found, and some of the wood to create said stone hatchet. Next you will want to use the wood that you gathered to create a ‘Hut’ which will be used to initially store your belongings, set up a campfire, and put down your sleeping bag.

Housing location is crucial. You will want to be close enough to some kind of resource. Rocks will usually spawn in the same area. You will also want to be able to be safe from animals, so that if you get chased by a bear/wolf/red bear/red wolf

you can get to a position where they can no longer find you, and you can ‘leash’ them by smacking and running away without the fear of dying. This also helps because they cannot camp you.(It also might be smart to hide your shelter from raiders, if at all possible.)

My first shelter, to give some pointers, was on an outcrop of rock. It allowed me to be safe from all monsters, and had some room on the outside to place a campfire. It didn’t take long at all to climb, and it served as a good point of reference so when I was coming back from a long trip, I didn’t get lost.

This is an optional Tip/Hint but I found it helpful: Place a campfire on top of your house with enough wood (30) so that when you leave during the night/day, you can light it on fire, and it will serve somewhat better than finding your house in the dark.

CLOSE YOUR DOORS! (this will lock them automatically, and only the owner can access what is inside. Without locking your doors, your items and chests are free game.

Рейды

Итак, вы достали каким-либо образом кевларовую броню и неплохое оружие. Следующий шаг — c4. На серверах с большим онлайном это не проблема, а вот что делать на обычном? Во-первых, c4 выпадает с заражённых животных, но бывают администраторы проэкта меняют это, железных или зелёных ящиков. Если на сервере air drop частый — то и с ящиков снабжения. Желательно изучить взрывчатое вещество — выпадает только с ящиков снабжения. Лучше не геройствовать и спокойно взорвать выбранный вами дом, когда его хозяев нет на сервере. В остальном же — вооружённых рейдах — ничего сказать нельзя. Всё зависит от ситуации и вашего опыта.

Основные команды

  • дерево.
  • notice.popuall «ваше сообщение» — Сообщение для всех на сервере от админа.
  • find * — Список доступных вами команд консоли.
  • Kick «ник игрока» — Кикнуть указанного игрока
  • ban «ник игрока@ or «стим айди» — Бан игрока по нику и стим айди.
  • banid «стим айди игрока» — Бан игрока по стим айди.
  • unbanall — Разбанить всех игроков которые находятся в бане.
  • save.all — сохраняет карту сервера и весь инвентарь игроков.
  • teleport.toplayer «ник 1 игрока» «ник 2 игрока» — Телепорт игроков.
  • teleport.toplayer «ник 1 игрока» «позиция по x» «позиция по y» — телепорт игрока на определенную позицию.
  • inv.giveplayer «ник игрока» «название вещи» «количество» — Дает игроку определенный предмет.
  • inv.giveall «название вещи» «количество» — Дает всем игрокам определенную вещь.
  • dmg.godmode true/fale — команда дает всем админам бессмертие.
  • crfting.complete — все начинают крафтить.
  • crafting.cancel — все прекращают крафтить.
  • crafting.instant true/false — Устанавливает мгновенный крафт для всего сервера.
  • crafting.instant_admins true/false — Устанавливает мгновенный крафт для админов.
  • crafting.timescale «количество» — устанавливает время крафта 1шт-0.5 секунд.
  • airdrop.drop — Вызывает самолет с лутом.
  • airdrop.min_players «количество» — самолет начинает сбрасывать лут только когда будет х количество игроков.
  • vihicle.spawn — Автомобиль появляется на вашем месте. (авто работает не корректно, ждем патчей, если сели в машину, то только релог).
  • server.hostname — Задает имя хосту.
  • server.pvp true/false — Включает или выключает пвп на вашем сервере.
  • server.maxplayers «количество» — устанавливает максимально допустимое количество человек на сервере.
  • sleepers.on true/false — это чтобы тела игроков оставались после выхода с сервера, если «false», то не оставались
  • env.timescale «число» — Устанавливает течением времени (день/ночь цикл) до определенной скорости, то по-умолчанию 0.0066666667.
  • falldamage.enabled true/false — Включает или выключает урон от падения с высоты.

Установка

Из репозитория

Для установки последней стабильной версии Rust из официальных репозиториев Arch Linux, установите пакет . Он установит компилятор rustc.

С помощью Rustup

Преимуществом использования Rustup вместо обычной устаноки Rust из репозитория является возможность установки нескольких toolchains (stable, beta, nightly) для нескольких целевых платформ (windows, mac, android) и архитектур (x86, x86_64, arm).

Есть два способа установки rustup: официально поддерживаемый разработчиками Rust и поддерживаемый Arch Linux.

Скачайте скрипт установки с помощью , просмотрите его: и запустите: для установки. Для обновления rustup в будущем запускайте .
Также пакет доступен в официальных репозиториях Arch Linux

Обратите внимание, что при установке с помощью этого пакета обновление с помощью работать не будет, и для обновления rustup следует обновлять этот пакет с помощью pacman.

Теперь нужно установить сам Rust. По умолчанию будет установлена стабильная версия для вашей архитектуры.

Примечание: Добавьте $HOME/.cargo/bin в переменную окружения PATH перед выполнением команды rustup.

$ rustup default stable

Проверим версию Rust с помощью  :

$ rustc -V 
rustc 1.13.0 (2c6933acc 2016-11-07)

Если вы хотите использовать nightly, выполните:

$ rustup install nightly
$ rustup default nightly
$ rustc -V 
rustc 1.15.0-nightly (c80c31a50 2016-12-02)

Проверка после установки

Давайте убедимся, что Rust установился корректно, написав простую программу:

~/hello.rs
 fn main() {
     println!("Hello, World!");
 }

Затем скомпилируйте её с помощью , введя это:

$ rustc hello.rs && ./hello
Hello, World!

При этом Rust не панацея

Тех, кто только планирует погрузиться в Rust, предупреждаю: это не панацея от всех болячек C++. Он защищает вас от гонки данных через проверку borrow checker, но пропускает дедлоки. Защищает от use-after-free, но только в safe-подмножестве. Если же работаете с unsafe — у вас, по сути, будет тот же С++, только с более продвинутой стандартной библиотекой.


Изображение: Альберто Блинчиков для Skillbox Media. Источник

Хотя и здесь не всё так однозначно. Многие важные фичи, например для разработки драйверов или встроенного ПО, остаются нестабильными, а значит, писать на Rust серьёзные проекты пока рискованно. По этой причине от Rust часто отказываются в пользу C++, где всё давно stable и unsafe.

Огнестрельное оружие

Название Рецепт Боеприпасы Урон Скорострельность Разлёт снаряда Размер магазина Перезарядка
Самодельный пистолет (Eoka Pistol) Очень простой пистолет, стреляет по одному патрону.

x150

x35

180 30 RPM 1 2.0s
Гвоздомёт (Nailgun)A construction tool turned deadly 18 400 RPM 0.75° 16 3.4s
Револьвер (Revolver) Шестизарядный револьвер.

x200

x100

x25

35 343 RPM 0.75° 8 3.4s
Полуавтоматический пистолет (Semi-Automatic Pistol) Полуавтоматический пистолет. Стреляет быстро и с высокой точностью.

x15

x25

40 400 RPM 0.75° 10 2.9s
Револьвер Питон (Python Revolver) A High Powered six-shooter. 45 400 RPM 0.5° 6 3.75s
Пистоле М92 (M92 Pistol) A semi-automatic Pistol. Fires rapidly and with good accuracy. Military Grade 45 600 RPM 15 2.2s
Самодельный дробовик (Waterpipe Shotgun) Дробовик из водопроводной трубы. Однозарядный.

x300

x100

180 13 RPM 1 2.4s
Винтовка (Bolt Action Rifle) Очень мощная и точная винтовка.

x300

x30

x100

80 35 RPM 4 5.0s
Помповый дробовик (Pump Shotgun) Помповый дробовик. Вмещает 6 патронов.

x300

x30

x40

210 55 RPM 6 5.5s
Пистолет-пулемёт Томпсона (Thompson)Пистолет-пулемёт Томпсона. Наносит урон средней силы.

x100

x35

37 462 RPM 0.5° 20 4.0s
Винтовка M39 (M39 Rifle)Военная полуавтоматическая винтовка. 50 300 RPM 0.1° 20 3.25s
Штурмовая винтовка (Assault Rifle)Автомат Калашникова — никаких компромиссов. 50 450 RPM 0.2° 30 4.4s
Самодельный пистолет-пулемёт (Custom SMG)Очень скорострельный пулемёт. Точность и дальность принесены в жертву скорости.

x100

x30

x10

30 600 RPM 0.5° 24 4.0s
MP5A4Очень скорострельный пулемёт. Точность и дальность принесены в жертву скорости. 35 600 RPM 0.5° 30 4.0s
Пулемёт M249 (M249)Ручной пулемёт с высоким темпом стрельбы и хорошим уроном. Невозможно создать 65 500 RPM 0.2° 100 7.5s
Полуавтоматическая винтовка (Semi-Automatic Rifle)Полуавтоматическая винтовка.

x450

x60

40 343 RPM 0.25° 16 4.4s
Огнемёт (Flame Thrower)Огнемёт, отличное средство для любителей позажигать.

x100

x250

x8

8 240 RPM 100 3.5s
Двухствольный дробовик (Double Barrel Shotgun) 180 120 RPM 0.5° 2 5.5s
LR-300 штурмовая винтовка (LR-300 Assault Rifle)Преследуйте своих врагов с этой мощной штурмовой винтовкой. 40 500 RPM 0.2° 30 4.0s
Винтовка L96 (L96 Rifle)A military issue high powered rifle. Extremely long range and accuracy. 40 500 RPM 0.2° 30 4.0s
Дробовик Spas-12 (Spas-12 Shotgun)A semi automatic military issue shotgun. 136 180 RPM 6 5.8s

Постройка дома и распределение обязанностей

Встретившись со своими компаньонами, приступайте к постройке дома. Вопреки советам многих, я рекомендую сразу начинать строить большой дом, пропустив деревянное укрытие (Wooden Shelter). Место для дома может быть выбрано заранее (уже строили там дом/приглянулось на другом сервере). В любом случае, не стройте рядом со Small Rad Town. Если вы опытный игрок, то сами знаете, почему.

В остальном же — ничего нового. Рядом — ресурсы, животные и город(а). НЕ СТРОЙТЕ ДОМ НА ОТКРЫТЫХ ПОЛЯНАХ И РЯДОМ С ДОРОГОЙ.

Отдайте всё дерево кому-то одному. Он должен заняться постройкой. Для начала — скрафтите нужное количество фундаментов. Установив их, можно поставить верстак и печку. Двери нужны сразу металлические, так что пока железо плавится, установите стены, потолок, дверные проёмы

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

Желательно, установите лестницу на второй этаж. Скрафтите и поставьте металлические двери.

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

Сбор материалов

Собирать материалы очень легко. Большинство предметов можно получить при помощи камня (дается при возрождении игрока или после повторного подключения на сервер).

Дерево

Дерево — один из жизненно важных ресурсов для выживания. Оно используется для создания костра, домов, складов, контейнеров, и множество другого.

Чтобы собрать дерево, есть два базовых способа и один способ грабежом:

1) Подойдите к ближайшему дереву и бейте его своим камнем,новым стартовым предметом. Вы получите сообщение в правой части экрана говорящее о том, как много дерева вы получили. Как только дерево будет исчерпано, двигайтесь к другому. Получение дерева этим способом легкое, однако не рекомендуется, груда деревьев предоставляет больше дерева за удар, чем удар по дереву.

2) Ищите груду деревьев. Они разбросаны по всей карте. Чтобы собрать груду деревьев, подойдите к ней и бейте её топором (чтобы скрафтить топор, Вам потребуются дерево и камень) пока она не исчезнет. Груда деревьев дает больше дерева за удар, чем удар по дереву.

3) Играйте как бандит,грабьте караваны убейте и заберите дерево у игрока,или украдите дерево из чужого контейнера.

Камень, железо и сера

Камень — базовый материал в Rust. Железо — главный компонент в создании железных домов, оружия, амуниции, а также кровати. Сера — участвует в производстве пороха, взрывчатки, гранат.

Чтобы добыть железо и серу, Вам нужно получить руды с такими названиями: железная руда (Metal Ore) и серная сульфуровая руда (Sulfur Ore).

Чтобы собрать эти материалы, Вам нужно найти скалу (выглядит, как округлый камень, одиноко стоящий в поле) и бить его камнем или топором, пока он не исчезнет.

Как только Вы добудете руду, найдите или сделайте печь и положите руду в печку вместе с деревом (костер не плавит руду). Спустя некоторое время, в печи вы найдете выплавленное железо и серу.

ОЧЕНЬ ВАЖНОЕ ПРИМЕЧАНИЕ, ЧИТАЙ НЕМЕДЛЕННО НОВЫЙ ИГРОК!

Чтобы открыть инвентарь печки или костра когда в них уже есть топливо, нужно ЗАЖАТЬ Е после чего можно выбрать Ignite (поджечь), или вторую опцию(которая открывает интерфейс).

Древесный уголь

Древесный уголь может быть найден, когда в костре (или в печке) сгорит дерево. Древесный уголь — это ключевой элемент в создании пороха. При соединении древесного угля с серой получится порох.

Еда

Еда используется для пополнения здоровья, калорий и удаления радиации (РАД).

В игре в настоящий момент есть два способа добыть еду:

1) Искать консервированную еду или продовольствие, которое может быть найдено в ящиках, в сумках, мутировавших животных, и мертвых игроках.

2) Охотиться на животных

Примечание: до того как начать охоту на волков(неплохой источник ткани и крови), медведей(единственный источник кожи), оленей(богаты тканью, не атакуют). Вам стоит убить пару мирных и медленных животных вроде кабана и сделать себе лук ( и стрелы ), для более продуктивной и быстрой охоты.

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

Ткань

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

В Rust нет бардака с библиотеками

У С++ всегда было две проблемы: недостаточная квалификация разработчиков и отсутствие нормальных пакетных менеджеров.

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


Изображение: Public Domain

Например, я видел реализации std::optional, которые не вызывают деструктор, даже если тип нетривиально деструктурируемый. Тогда как стандартная реализация — это куча boilerplate-кода, который даже командой из трёх-четырёх человек невозможно отладить.

Получается полный бардак. Часть кода покрывают тестами, она кое-как работает, а когда начинаешь детально тестировать — тут дедлок, там use-after-free и так далее. В Rust эти заботы можно частично переложить на плечи компилятора, но с ним иногда приходится бороться: богатая система типов требует более педантичной работы.

Construction

Construction items have a separate rendered model when placed.

Armored Door Armored Double Door Barbed Wooden Barricade
Building Plan Chainlink Fence Chainlink Fence Gate
Code Lock Concrete Barricade Floor Grill
High External Stone Gate High External Stone Wall High External Wooden Gate
High External Wooden Wall Ladder Hatch Large Water Catcher
Lock Metal Barricade Metal horizontal embrasure
Metal Shop Front Metal Vertical embrasure Metal Window Bars
Mining Quarry Netting Prison Cell Gate
Prison Cell Wall Pump Jack Reinforced Window Bars
Sandbag Barricade Sheet Metal Door Sheet Metal Double Door
Shop Front Small Water Catcher Stone Barricade
Tool Cupboard Wood Double Door Wood Shutters
Wooden Barricade Wooden Door Wooden Ladder
Wooden Window Bars Reinforced Glass Window Garage Door

Locks

Locks are used to keep people from accessing valuables. Locks can be placed on doors, containers (storage boxes and vending machines) and the Tool Cupboard. There are two different types of locks: the Key Lock which can be crafted with Wood, and the Code Lock which requires Metal Fragments. Both are available to craft by default.

To place a Key Lock, select it and left click on the target. Once deployed, target the lock, hold down the Use key (default «E») and select Lock; only the person who locks the door can open it. To create keys to allow other people through the door, hold down the Use key and select Create Key (requires 25 Wood). Multiple key copies can be created either whoever placed the lock initially or anyone with a key. Other players can kill those who have keys in their inventory and will therefore gain access your base, so keep them safe!

The other lock is the code lock, (100 Metal Fragments) which uses a 4 digit code instead of a key.

Быстрое развитие

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

Структуры

Rust не является объектно-ориентированным языком, но у него есть некоторые функциональные средства, которые могут имитировать поведение, характерное для такого рода языков. Когда мы работаем с классами в JavaScript, то имеем дело с данными и методами в одном и том же месте. В Rust мы будем отделять представление данных от методов, которые с ними работают. Вот как это происходит:

struct Dog {    name: String,    score: i32}impl Dog {    fn say_something(self: &Dog) {        println!("Hey, my name is {}... I mean WOOF!", self.name);    }}fn main() {    let dog = Dog { name: String::from("Boira"), score: 13 };    dog.say_something();}

Структура очень похожа на объект JavaScript, но она отличается от него. Структура — это форма каких-то данных, которые будут иметь два именованных поля: и . Ниже структуры располагается блок реализации (сокращённо ). Вот так мы можем объявлять методы, которые будут работать с данными. И заметьте: если понадобится связать функцию с этими данными, нам нужно будет передать в качестве первого аргумента. Напоминает Python, не находите?

Опуская значение , мы объявляем метод, который не связан с какими-то конкретными данными. Можно провести аналогию со статическим методом в классе JavaScript.

Что нужно, чтобы начать использовать Rust?

Первым делом нужно установить Rust. Нет ничего проще: заходите на сайт https://rustup.rs и загружаете официальный установщик набора инструментальных средств. Это то же, что и nvm, который обычно используется с JavaScript.

Затем вам понадобятся библиотеки — не начинать же всё совсем с нуля. Поэтому точно так же, как мы обзаводимся пакетами Node на JavaScript, мы будем поступать и с пакетами Rust. Зайдите на crates.io, официальное хранилище крейтов, чтобы подробнее разузнать о пакетах на Rust.

Rust универсален, поэтому существует множество ситуаций, где его можно использовать. Есть и сообщество, которое не покладая рук работает, отслеживая их на разных сайтах:

www.arewewebyet.org: несмотря на то, что платформы не достигли пока такой зрелости, как Ruby on Rails, кое-что сделать с их помощью вы бы могли! Рекомендую обратить внимание на платформу Rocket, если вы желаете заняться веб-разработкой. Вы даже можете создавать GraphQL API с помощью Juniper!

www.arewegameyet.com: полностью освоив управление памятью, можно переходить к созданию игр, Rust отлично для этого подходит! Если вас манит разработка игр, рекомендую игровой движок Amethyst.

www.arewelearningyet.com: машинное обучение

Это ещё одна тема, которая сейчас очень популярна. Экосистема Rust пока ещё не укомплектована полностью и прямо сейчас не может на равных конкурировать с Python в том, что касается машинного обучения, но если вам интересна эта тема, зайдите на сайт!

А если вы занимаетесь веб-разработкой, можно сказать, что вам повезло! Вы можете создавать программы, компилировать их и использовать всё это вместе с тем кодом, который у вас на JavaScript. WebAssembly — вот технология, которая сделала это реальным, и её прямо сейчас во всех современных браузерах.

Если хотите её опробовать, рекомендую почитать официальную книгу с документацией по Rust и WebAssembly.

Заключение

Rust — это нереально крутой язык, который стоит освоить, ведь с его помощью столько всего можно сделать! Если вы веб-разработчик, как и я, то вам будет очень интересно читать о WebAssembly, и я надеюсь, что смогу сделать ещё статьи об этом.

Если вы хотите приступить к освоению Rust, рекомендую начать с этого официального ресурса и попробовать написать имеющиеся программы на JavaScript с помощью Rust. Как и во многом другом, практика — это ключ к успеху!

В заключение отметим, что эта статья написана по мотивам доклада, представленного автором на семинаре разработчиков JS Coders meetup event. Со слайдами вы можете ознакомиться здесь.

  • 3 фундаментальных постулата JS, приближающих вас к Pro-статусу
  • Добро пожаловать в ад…зависимостей JavaScript
  • Rust и разработка кроссплатформенных решений для мобильных устройств

Читайте нас в телеграмме, vk и

Структуры

Еще одним важным понятием в Rust являются структуры, называемые . Это пользовательские типы данных, создаваемые для представления типов объектов. При создании определяется набор полей, для которых все структуры этого типа должны иметь какие-то значения.

Аналогом этих структур в таких языках, как Java и Python, являются классы.

Вот синтаксис объявления структуры:

struct  {    : ,   : ,}
  • сообщает Rust, что следующее объявление определит тип данных struct.
  • — это имя типа данных, используемого при передаче параметров, таких как или , в строковые и целочисленные типы соответственно.
  • эти фигурные скобки обозначают начало и конец переменных, необходимых для структуры.
  • — это место, где вы называете первую переменную, которую должны иметь все экземпляры этой структуры. Переменные внутри структуры называются полями.
  • — это место, где во избежание путаницы явно определяется тип данных переменной.

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

struct Car{    brand: String,    year: u16,};

Каждый создаваемый экземпляр типа должен иметь значения для этих полей. Поэтому создадим экземпляр для конкретного автомобиля со значениями для (модели) и (года выпуска).

let my_car = Car {    brand: String:: from ("BMW"), // с явно заданным строковым типом    year: 2009,};

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

let  =  {// поля}

Оттуда будем использовать значения этих полей с синтаксисом . Rust интерпретирует эту инструкцию как «каково значение для идентификатора ?».

println!(        "My car is a {} from {}",        my_car.brand, my_car.year    );}

Вот как выглядит вся структура целиком:

fn main () {struct Car{    brand: String,    year: u16,};let my_car = Car {        brand: String:: from ("BMW"),    year: 2009,};println!(        "My car is a {} from {}",        my_car.brand, my_car.year    );}

В целом структуры отлично подходят для хранения вместе всей информации, относящейся к тому или иному типу объекта, для реализации и обращения к ней в программе.

Система сборки Rust: Cargo

Cargo — это система сборки и диспетчер пакетов Rust. Это важный инструмент для организации проектов на Rust. Здесь приводится перечень библиотек, необходимых проекту (они называются зависимостями). Он автоматически загружает любые отсутствующие зависимости и собирает программы на Rust из исходного кода.

Программы, с которыми мы имели дело до сих пор, достаточно просты, и поэтому зависимости для них не нужны. А вот при создании более сложных программ вам понадобится Cargo с возможностями инструментов, недоступных в рамках стандартной библиотеки. Cargo также используется для загрузки проектов в портфолио на GitHub, так как они хранят все части и зависимости вместе.

Если скачать Rust с официального сайта, Cargo автоматически устанавливается вместе с компилятором () и генератором документации () как часть набора инструментальных средств Rust. Убедиться, что Cargo установлен, помогает ввод в командной строке следующей команды:

$ cargo --version

Для создания проекта с Cargo запустите в интерфейсе командной строки операционной системы следующее:

$ cargo new hello_cargo$ cd hello_cargo

Первой командой создается новый каталог . А второй командой этот новый каталог выбирается.

Генерируется манифест под названием , который содержит все метаданные, необходимые Cargo для компиляции пакета, а также файл , отвечающий за компиляцию проекта.

Чтобы все это увидеть, наберите:

$ tree

Перейдите к местоположению вашего каталога и откройте файл . Внутри вы найдете информацию о проекте. Выглядит это следующим образом:

name = "hello_cargo"version = "1.43.0"authors = edition = "2020"

Все зависимости приведены в категории .

После завершения проекта введите команду : проект будет скомпилирован и запущен.

Продвинутые концепции для дальнейшего изучения

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

  • 7 Лучших курсов и книг по программированию на Rust для начинающих в 2021 году
  • Rust или Си: кто Усэйн Болт в мире программирования?
  • Rust: реализация двоичного дерева

Читайте нас в Telegram, VK и

Владение

Это понятие, на мой взгляд, самое сложное для понимания, потому что оно сильно отличает Rust от других языков, с которыми я работал, но именно оно делает Rust быстрым и безопасным!

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

fn main() {    let x = String::from("hello"); // x владеет строчкой "hello"    let a = x; // В этот момент a владеет строчкой "hello", и x больше не является валидным    do_something(x); // ОШИБКА: x больше не может использоваться!}

В Rust нет значений и , поэтому мы не можем описать некую переменную, которая не имеет значения. В предыдущем примере, когда мы присвоили значение , мы переместили значение от к , то есть теперь не имеет валидного значения. То же самое происходит с функциями:

fn main() {    let x = String::from("hello");    do_something(x);    do_other_thing(x); // ОШИБКА: x больше не может использоваться!}fn do_something(s: String) {    // Что-то выполняется с s}

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

Такое поведение не всегда желательно, но в Rust мы можем заимствовать, ведь здесь существует понятие заимствования! Если вам не хочется перемещать значение от одной переменной к другой, воспользуйтесь ссылкой:

fn main() {    let x = String::from("hello");    do_something(&x);    do_other_thing(&x); // Теперь это нормально, потому что мы не перемещаем значение}fn do_something(s: &String) {    // Что-то выполняется с s}

Когда мы имеем дело с владением и заимствованием, Rust хочет, чтобы мы играли по правилам, поэтому он предупредит, если мы попытаемся сделать что-то не то:

Если при изучении владения и заимствования вам что-то непонятно, сбивает с толку или вы запутались, ничего страшного — это нормально! Ведь вы приступаете к теме управления памятью, а это непростая тема. Я рекомендую посмотреть вот это видео, чтобы подробнее узнать об этом.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector