Мы исследуем переменные, изменчивость и типы данных.
Эта статья является частью серии, начинающейся с Изучение Rust путем сравнения с TypeScript: Часть 1.
Код для этой статьи доступен для загрузки; Rust скачать и TypeScript скачать.
Приложение 11/5/19: добавлен раздел Control Flow с отдельным R ust download и TypeScript скачать.
Переменные и изменчивость
Давайте пройдемся по примерам в разделе Rust Book Переменные и изменчивость и сравним их с TypeScript.
В Rust переменная, установленная с помощью let, как показано, является неизменной.
В TypeScript эквивалентом является переменная, установленная с помощью const.
примечание: и в Rust, и в TypeScript типы переменных выводятся с правой стороны; таким образом, явная типизация не требуется.
В Rust переменная, установленная с помощью let mut, как показано, является изменяемой.
В TypeScript эквивалентом является переменная, установленная с помощью let.
В Rust переменная, установленная с помощью let и let mut, может быть установлена во время выполнения:
То же самое для TypeScript для переменных, установленных с помощью как const, так и let:
Rust имеет другой неизменяемый тип переменной; const. Однако, в отличие от let, const не может быть установлен во время выполнения (устанавливается только во время компиляции). Имена переменных const в верхнем регистре используются по соглашению.
TypeScript не имеет эквивалентного типа переменной. В этой ситуации обычно используется тип переменной TypeScript const и по соглашению просто присваивается имя в верхнем регистре.
Rust позволяет переопределить или затенять переменную типа let:
примечание. Важно отметить, что результирующая переменная a все еще может быть неизменной. Кроме того, хотя это не показано в этом примере, типы переменных также могут отличаться из-за затенения.
TypeScript не имеет эквивалентной функции, то есть TypeScript не может повторно объявить переменную с блочной областью видимости. В TypeScript в этой ситуации часто просто создается новое имя переменной const.
Типы данных
Теперь пройдемся по примерам в разделе Rust Book Типы данных; начиная со скалярных типов Rust.
Давайте рассмотрим эквиваленты (называемые примитивами) в TypeScript:
Одно большое отличие состоит в том, что в JavaScript (и, следовательно, TypeScript) все числа представляют собой 64-битные числа с плавающей запятой, тогда как в Rust есть несколько целочисленные и плавающие типы.
Другое отличие состоит в том, что JavaScript (и, следовательно, TypeScript) имеет примитивный тип string, который может содержать произвольное количество символов; не просто один персонаж.
Rust имеет два составных типа; кортеж и массив. Кортеж - это упорядоченный список фиксированной длины различных типов. Массив, представляющий собой упорядоченный список фиксированной длины одного типа.
В TypeScript кортеж по сути такой же, как в Rust. Однако массив имеет произвольную длину, например, мы можем добавить значение.
Боковая панель в объект или ссылку
До сих пор Rust и TypeScript были относительно похожи; однако в составных типах таится большая разница. Разница в том, как каждый из них хранит составные типы в переменных.
В Rust значением переменной составного типа является сам объект.
Наблюдения:
- Мы должны использовать let mut для tup2, чтобы позже изменить значение
- Назначение tup2 на tup3 (копирование их значения) создает полностью новый кортеж
- В результате изменение tup2 не имеет отношения к tup3
- Некоторая логика применима к массивам
С другой стороны, в TypeScript значение составного типа является ссылкой на объект.
примечание: в TypeScript примитивные типы (логическое, число, строка) работают как Rust со значением переменной, являющимся самим объектом.
Наблюдения:
- Мы можем использовать const для tup2, потому что мы изменяем объект, а не ссылку
- Назначение tup2 для tup3 (копирование их значения) копирует ссылку на тот же объект кортежа
- В результате изменение tup2 действительно изменяет общий объект кортежа, на который ссылаются как tup2, так и tup3
- Та же логика применяется к массивам
Я уже вижу, что мне нужно немного привыкнуть к этому, поскольку у меня в голове врезался шаблон TypeScript.
Приложение 11/8/19. Написав еще пару статей, я пришел к выводу (думаю, это тоже было похоронено в книге Rust), что составные типы Кортеж и массив, вероятно, будут использоваться только как константы, например, дни недели, и поэтому разница между Rust и TypeScript не имеет значения. В частности, мы, скорее всего, будем использовать тип Rust Vec как эквивалент массивов TypeScript.
Поток управления
Основные концепции потока управления в Rust и TypeScript практически идентичны; подтвердив это, пройдя через примеры в разделе Rust Book Control Flow.
То же, что реализовано в TypeScript:
Наблюдения:
- Шаблон Rust, в котором последняя строка функции представляет собой выражение (без точки с запятой), означающее, что возвращаемое значение было для меня новым
- Привыкнув к тернарному оператору TypeScript, я обнаружил, что эквивалент Rust немного подробен.
- В Rust для меня в новинку иметь цикл, возвращающий значение.
Дальнейшие действия
Мы углубимся в сложности владения в следующей статье: Изучение Rust путем сравнения с TypeScript: Часть 3.