Учебник по программированию на 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()
. Следовательно, чтобы создать вектор User
s:
Функции в 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 на более сложные темы, так что следите за обновлениями 😊.
Арун Мэтью Куриан, Абхишек Гупта