Узнайте, как объявлять изменяемые и неизменяемые переменные
Это вторая часть серии статей о Rust для разработчиков JavaScript, в которой мы исследуем написание кода на Rust с точки зрения разработчика JavaScript. Цель состоит в том, чтобы дать разработчикам JavaScript базовые знания, необходимые им для участия в проектах Rust в экосистеме JavaScript.
В прошлый раз мы узнали, как написать приложение Hello World на Rust и сравнили это с тем, как мы сделали бы это на JavaScript; сегодня мы рассмотрим назначение переменных и включение их выходных данных в текст, записываемый в консоль.
Полный код этого упражнения можно найти здесь.
Представляем сегодняшнюю программу
Наша целевая программа, написанная на JavaScript, выглядит следующим образом:
// JavaScript
const myName = "Tom";
let myAge = 39;
console.log("Hello world!");
console.log(`My name is ${myName}`);
console.log(`I am ${myAge} years old`);
myAge += 1;
console.log(`Next year I'll be ${myAge} years old`);
Вывод консоли здесь:

Здесь мы вводим 2 переменные: myName и myAge. Мы используем ключевое слово const с моим именем, так как не хотим обновлять это значение. Однако мы используем let с myAge, потому что мы хотим обновить это значение позже.
Конечно, это довольно тривиальная программа, но она достаточно хороша, чтобы дать нам представление о двух наиболее распространенных типах переменных в Rust и о том, как их использовать. Осторожно, разработчики JavaScript: у Rust много общих ключевых слов с JavaScript, но их использование сильно отличается!
Неизменяемые переменные
В нашей программе JavaScript мы не хотели, чтобы значение нашей переменной myName менялось, поэтому мы использовали ключевое слово const для ее определения. Чтобы достичь той же цели в Rust, что несколько сбивает с толку нас, разработчиков JS, мы будем использовать let. Правильно — способ сделать неизменяемую переменную в Rust выглядит так же, как мы написали бы изменяемую переменную в JS. Давайте посмотрим на код (обратите внимание на включение обязательной функции main).
// Rust
fn main() {
let my_name = "Tom";
println!("Hello world!");
}
Обратите также внимание, что мы использовали snake_case вместо camelCase для имени переменной — это соглашение Rust.
Чтобы доказать себе, что переменная действительно неизменяема, попробуйте запустить следующий код и посмотрите, что произойдет:
// Rust
fn main() {
let my_name = "Tom";
my_name = "Edward";
println!("Hello world!");
}
Вы увидите пару предупреждений о неиспользуемых переменных, но пропустите их до сообщения об ошибке:
// shell cargo run [...] error[E0384]: cannot assign twice to immutable variable `my_name` --> src/main.rs:3:5 | 2 | let my_name = "Tom"; | ------- | | | first assignment to `my_name` | help: consider making this binding mutable: `mut my_name` 3 | my_name = "Edward"; | ^^^^^^^^^^^^^^^^^^ cannot assign twice to immutable variable For more information about this error, try `rustc --explain E0384`.
Мы обнаруживаем, что действительно не можем изменить его, как и нашу версию JavaScript. Вы заметите, что он дает нам предложение о том, как сделать его изменяемым, если мы этого хотим: help: рассмотрите возможность сделать эту привязку изменяемой: `mut my_name`. В следующем разделе мы рассмотрим это ключевое слово mut.
Изменяемые переменные
В Rust для достижения той же цели, что и с ключевым словом let, мы используем let mut. Давайте посмотрим, как это работает на нашем неудачном примере выше:
// Rust
fn main() {
let mut my_name = "Tom";
my_name = "Edward";
println!("Hello world!");
}
Теперь он компилируется и успешно печатает «Hello World!». Давайте применим то, что мы только что узнали, для создания изменяемой версии Rust let myAge = 39 и myAge += 1.
// Rust
fn main() {
let my_name = "Tom";
let mut my_age = 39;
println!("Hello world!");
my_age += 1;
}
Запустите cargo run, и вы обнаружите, что это компилируется и запускается.
Интерполяция строк
Хорошо! Итак, мы можем назначать наши переменные, но как вывести их на консоль как часть сообщения, как мы это сделали в коде JavaScript:
// JavaScript
console.log(`My name is ${myName}`);
console.log(`I am ${myAge} years old`);
Как мы увидим, в Rust есть несколько иной подход к этому. Эквивалентный Rust показан ниже:
// Rust
// Note: main function removed for brevity
println!("My name is {}", my_name);
println!("I am {} years old", my_age);
Как мы видим, в Rust нам нужно оставить заполнитель «{}» в выходной строке, а затем передать значение в качестве параметра макросу println!.
Обратите внимание, что вы не ограничены одним параметром на строку — вы можете использовать столько, сколько хотите:
// Rust
println!("My name is {} and I am {} years old", my_name, my_age);
Существует множество интересных вариаций println!, поэтому, если вы хотите узнать об этом больше, взгляните на эту статью.
Последняя программа Rust
Давайте посмотрим на обе программы бок о бок. Во-первых, JavaScript:
// JavaScript
const myName = "Tom";
let myAge = 39;
console.log("Hello world!");
console.log(`My name is ${myName}`);
console.log(`I am ${myAge} years old`);
myAge += 1;
console.log(`Next year I'll be ${myAge} years old`);
Теперь ржавчина:
// Rust
fn main() {
let my_name = "Tom";
let mut my_age = 39;
println!("Hello world!");
println!("My name is {}", my_name);
println!("I am {} years old", my_age);
my_age += 1;
println!("Next year I'll be {} years old", my_age);
}
Вызов кодирования
Теперь пришло время сделать аналогичную программу самостоятельно. Напишите программу, которая выводит на консоль следующее:
My first cell phone was a <your_first_phone_model> I got it in <year_you_got_phone> Now I have a <your_current_phone_model>
Обязательно сохраните типы телефонов и год, когда вы получили свой первый телефон, в переменных — не записывайте их просто в выходной строке. Кроме того, используйте только одну переменную для типа телефона и переназначьте ее значение. Бонусные баллы, если вы можете использовать вариант println! из этой статьи.
Обязательно поделитесь своим единственным решением в комментариях и сравните с другими!
После: как насчет ключевого слова const в Rust?
Некоторые из вас, возможно, уже слышали, что в Rust есть собственное ключевое слово const, и вам может быть интересно, почему его здесь нет. Причина в том, что const в Rust существует для конкретного варианта использования, который трудно понять, не узнав сначала о времени жизни и владении. Не волнуйся! Мы рассмотрим const в следующей статье, после того как рассмотрим эти темы.
Я надеюсь, что вы нашли это введение в переменные Rust полезным. Если у вас есть какие-либо вопросы, не стесняйтесь задавать их ниже, и если вы нашли какие-либо ошибки, обязательно укажите их, чтобы я мог их исправить. Удачного кодирования!