Учебник по программированию на Rust для начинающих.

Однажды мой коллега спросил: Вы когда-нибудь слышали о программировании на Rust? Это новый язык программирования, не объектно-ориентированный и намного более быстрый, чем C ++ . Ну, я тогда еще не слышал и не пользовался этим. Однако этот вопрос достаточно вдохновил меня, чтобы научиться программировать на Rust. После этого я записался на курс Udemy: Программирование на Rust для начинающих и сразу начал его изучать. В этой статье я хотел бы поделиться тем, что я узнал, что охватывает почти половину курса.

Превосходство Rust над многими языками программирования, включая C ++, заключается в системе владения, которая автоматически управляет памятью. В Rust владельцем памяти является переменная, и у памяти не может быть более одного владельца одновременно. Чтобы получить доступ к значениям, хранящимся в памяти, мы можем их позаимствовать. В противном случае право собственности переходит к новой переменной. Если это покажется сложным, не волнуйтесь! Просто имейте это в виду. Я объясню это более подробно в следующих разделах.

Основы

  • Типы данных

В Rust типы данных: Boolean (true, false), Integer (i32, i64), Float или Double (f32, f64), Character (_ 4_) и String (str).

Тип данных String немного сложнее для работы с другими. Я объясню это позже, в следующем разделе.

  • Комментарии

Как и в C ++, вы можете создавать комментарии, используя двойную косую черту //.

  • переменные

Мы можем назначить данные переменной по ключевому слову let:

По умолчанию переменные неизменяемы. Для создания изменяемой переменной мы должны явно объявить ее let mut:

. Математические операции

Математические операции: плюс +, минус -, умножение *, деление / и частное %.

Обработка данных в Rust

  • Enum

Enum - это сокращение от перечисления, и это тип для создания элементов или вариантов. Имя и варианты перечисления должны быть заглавными. Например, чтобы создать перечисление для разных цветов:

Enum - это тип для представления одного элемента за раз, и каждый элемент называется вариантом.

  • Структура

Struct - это сокращение от структуры, и он создает структурированный объект с несколькими свойствами или данными. Например, чтобы создать объект «Пользователь» со свойствами, включая имя, национальность, рост, вес и цвет глаз:

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

  • Кортежи

Кортеж - это набор данных, объектов или переменных одного или разных типов. Кортеж создается (), и удобно хранить набор данных с разными типами по порядку. Например:

Индексы начинаются с нуля, поэтому с numbers.0 мы можем получить доступ к первому элементу numbers.

  • Векторы

Вектор - это набор данных, объектов или переменных только одного типа. Мы можем создавать векторы с помощью макроса vec или структуры Vec. Например, чтобы создать вектор имен пользователей:

Для доступа к элементу вектора используется []. Например, третье имя пользователя - usernames[2].

  • Строки

Тип данных Строки сложнее, чем целые числа или числа с плавающей запятой. Как видите, имя пользователя в структуре User имеет тип String. Однако для создания экземпляра пользователя мы не можем написать name: "Sara". Если мы это сделаем:

мы сталкиваемся с ошибкой expected struct `String`, found `&str`. Это означает, что такой текст, как "Sara", не является собственной строкой, а является заимствованной строкой (&str). Мы можем создать собственную строку с помощью name: "Sara".to_owned() или name: "Sara".to_String(). Следовательно, чтобы создать вектор Users:

Функции в Rust

Ключевое слово для создания функции в Rust - fn. Мы должны указать типы параметров, если мы передадим их функции. В сигнатуре функции мы указываем тип каждого параметра :. Если тип не является простыми типами данных, такими как целые числа, числа с плавающей запятой или логические значения, мы должны заимствовать его, используя амперсанд &. В противном случае память перемещается в функцию, а право собственности на переменную будет удалено. Например, написать функцию для печати имен пользователей:

В этом примере мы можем использовать заимствованный строковый тип для печати текста: print("Sara").

В качестве другого примера, чтобы написать функцию для расчета ИМТ пользователя на основе веса и роста:

В этом примере функция заимствует экземпляр User struct, принимает вес и рост пользователя для вычисления ИМТ и возвращает float. .

Условные выражения

  • если еще

If-else - наиболее распространенный тип условных выражений; если какое-то условие выполняется, сделайте что-нибудь. Например, если ИМТ пользователя меньше 25, он / она в норме, если от 25 до 29, он / она имеет избыточный вес, а более 29 - ожирение. Чтобы запрограммировать это, мы говорим:

В первой строке мы создаем переменную с именем sara_bmi и с помощью функции bmi и вектора users, которые мы создали ранее, вычисляем ИМТ Сары.

  • Соответствие

Что ж, Match - это условие, которое учитывает все случаи. Он похож на switch в C ++, но не эквивалентен. Однако он может обрабатывать больше типов данных. Я считаю, что это делает программу умнее, чтобы мы не упустили ни одного случая по ошибке. Например:

В этом примере я создал переменную с именем user_eyecolor, и для каждого случая я хочу сделать предположение. Если у пользователя синий цвет глаз, я предполагаю, что он / она из Германии, если он / она из России и других стран (_), я не догадываюсь.

Петли в Rust

  • Для

Для перебора всех элементов коллекции данных, таких как векторы, мы используем циклы for. Например, чтобы вычислить ИМТ всех пользователей и распечатать имя и ИМТ для каждого пользователя:

В качестве другого примера, чтобы вычислить среднее значение ИМТ пользователей

В этом примере я создал изменяемую переменную с именем bmi_sum, чтобы суммировать ИМТ пользователя в цикле for, и неизменяемую num_users, которая является длиной users вектора в приведенных выше примерах. Затем разделите сумму ИМТ на количество пользователей. Обратите внимание, что мы должны объявить, что num_users следует рассматривать как число с плавающей запятой. В противном случае мы получим ошибку компилятора, так как целочисленное деление с плавающей точкой в ​​Rust невозможно.

  • Пока

Повторение команды при выполнении некоторого условия выполняется в while цикле. Например, чтобы создать вектор ИМТ пользователя:

В этом примере я создал изменяемую итеративную переменную i и пустой вектор для ИМТ пользователя. Это также должно быть изменяемым, потому что оно пустое, и мы хотим заполнять его на каждой итерации. Как я уже упоминал, используя Vec struct, мы можем создать вектор, а new() является функцией структуры Vec, которая создает пустой вектор. Используя функцию push(), мы можем добавить член к вектору.

  • Цикл

Как и match, loop - это новая функция в Rust. Он очень похож на цикл while, и идея та же; сделай что-нибудь, пока не сломаешься. Чтобы выполнить предыдущий пример с loop loop!

Как видите, я поставил условие обрыва в loop. В противном случае, если мы получим index out of bounds ошибку!

Функции структур в Rust

Последние два примера могут показаться более сложными, потому что я пока не говорил о функциях в структуре. В последних двух примерах new и push - это две функции в структуре Vec.

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

Например, чтобы добавить функцию new() для создания нового экземпляра User:

В этом примере new() возвращает экземпляр User struct. См. Сводку по использованию и полные примеры!

Резюме

Напомним, напишите программу для создания коллекции пользователей и вычисления среднего значения ИМТ пользователей:

В этом примере я собрал все предыдущие примеры в один. Построчно просмотрите все, что вы узнали в этом руководстве 😊.

Заключение

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

Арун Мэтью Куриан, Абхишек Гупта