Rust от 0 до 80% для разработчиков JavaScript

Rust от 0 до 80% для разработчиков JavaScript

10 мая 2022 г.

В этой статье перечислены несколько тем, которые помогут вам быстро понять Rust, если вы являетесь разработчиком JavaScript. Многие учебники начинаются с нуля. Но если вы уже знаете что-то еще, почему бы не сравнить их?


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


Отказ от ответственности!


Я очень далек от того, чтобы хорошо разбираться в Rust. Вот как я их интерпретирую и не более того. У Rust довольно обширная документация, поэтому, если вам нужны подробности, поищите их в Google. Книга является отличной отправной точкой для изучения ржавчины. Моя цель — перечислить важные вещи, чтобы вы (и я в будущем) могли пропустить общие концепции программирования и сосредоточиться на различиях, основанных на уже известных вам знаниях.


Типы


Rust — типизированный язык, поэтому он ближе к TypeScript. У вас будет гораздо лучший опыт, если вы уже знаете TS.


По большей части оба синтаксиса похожи (имя_переменной: Тип) ура!


змея_кейс


Ага, не обойти.


Что это за символ?


1. Вопросительный знак (?)


Вы можете увидеть ? после вызова функции, например: my_function()?;.


Нет, это не необязательная цепочка. [Это магия обработки ошибок для функций, которые могут дать сбой (функции с ошибками)] (https://stackoverflow.com/a/42921174/3101690). Вы часто будете видеть это при работе с асинхронными функциями. Подробнее об этом позже.


[Документация] (https://rust-lang.github.io/async-book/07_workarounds/02_err_in_async_blocks.html)


2. Восклицательный знак на функциях (!)


Пример: println!("{:?}", my_variable);


[Это указывает на то, что это макрос] (https://doc.rust-lang.org/book/ch19-06-macros.html). В JS нет ничего подобного. Макросы — это способ написания кода, который пишет другой код. Вы можете думать об этом как о пользовательском синтаксическом сахаре. Просто используйте его, если пример функции показывает это.


3. Символ &


Пример: &ваша_переменная


Чтобы получить ссылку. Вы узнаете это, если использовали языки низкого уровня, такие как C. Подробнее позже.


Синтаксис


  1. Точка с запятой (;) в конце каждой строки обязательна.

  1. Исключение: точка с запятой (;) не обязательна в последней строке функции. В данном случае это ярлык для возврата этой строки.

  1. [Синтаксис функции немного отличается] (https://doc.rust-lang.org/book/ch03-03-how-functions-work.html). Не ахти какое дело.

ржавчина


fn foo(число: i32) -> i32 {


3 // См. № 2


// или


// вернуть 3;


  1. [Синтаксис декоратора также отличается] (https://doc.rust-lang.org/reference/attributes.html). Его также называют Атрибуты.

Что это за ключевые слова?


структура


Это объект JSON. (Хорошо, это сложнее, но см. документы для этого)


введите Человек = {


имя: строка;


фамилия: строка;


структура человека {


имя_имя: строка,


last_name: Строка,


черта характера


Интерфейс


реализация


[Реализация черты] (https://doc.rust-lang.org/book/ch10-02-traits.html). Ближе всего к этому у нас есть классы. Это связь между «чертой» и типом. Я не использовал его


перечисление


[В некотором смысле очень похоже на перечисления Typescript] (https://doc.rust-lang.org/book/ch06-01-defining-an-enum.html?highlight=enum#enum-values). Но вы можете хранить в нем данные. Это довольно изящная и довольно важная концепция для понимания асинхронности.


Console.log


Не так просто, к сожалению. Это больше похоже на printfиз других языков


println!("{:?}", my_variable);


Библиотека/зависимости


Используйте Cargo.toml вместо package.json. [Вы захотите добавить их вручную] (https://github.com/rust-lang/cargo/issues/4) (вместо использования такой команды, как yarn add)


[Документация] (https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html)


Пример:


[зависимости]


хроно = "0,4"


яйцо-режим = "0.16.0"


Импорт


В Rust есть модули. Он сильно отличается от JS, но в основном:


Это что-то вроде пространств имен.


Вот разбивка по импорту зависимости:


используйте ракету::serde::{json::Json, Deserialize, Serialize};


use - используйте это вместо import


ракета - это имя пакета


:: - доступ к модулю


serde - имя модуля


{json::Json, Deserialize, Serialize} - вещи, которые нужно импортировать


Еще немного синтаксиса:


использовать хроно::прелюдия::*;


использовать rusqlite::Result;


Импорт из локальных файлов


Лучшее объяснение: https://doc.rust-lang.org/rust-by-example/mod/split.html


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


Затем используйте, чтобы импортировать его. Примечание: mod также автоматически импортирует его. В этом случае вам нужно будет добавить к нему префикс «crate».


Пример:


используйте crate::your_file_or_module;


Примечание: mod.rs — это специальное имя файла, которое действует как index.js.


См. ссылку выше для примеров.


Константа против пусть


В JavaScript вы бы использовали const большую часть времени, потому что это неизменяемо.


В Rust лучше использовать let. Это неизменно по умолчанию. Если вы хотите, чтобы он был изменяемым, используйте ключевое слово mut. const зарезервировано для фактических констант (поэтому вы не можете вычислить значение из другой переменной)


пусть неизменяемая_переменная = ...;


пусть mut mutable_variable = ...;


const MY_CONSTANT = "КОНСТАНТ";


Документация библиотеки


Если в репозитории Github нет ссылки на страницу документации, вы, вероятно, можете перейти к ней следующим образом:




Асинхронный


Безусловно, две самые запутанные темы — это фьючерсы и собственность. Я бы порекомендовал прочитать более полную документацию для них. Сначала поговорим о фьючерсах.


«Будущее» похоже на «Обещание». В отличие от JS, в Rust есть тип результата обещания/будущего, который называется Result. Он также принимает тип ошибки в дженериках (хотелось бы, чтобы JS имел это). Вы также можете использовать «Результат» отдельно без «будущего».


Исполнение (или «потребление») Future


Стандартная библиотека довольно проста, поэтому вам нужно будет импортировать что-то еще (например, bluebird для JS). Вам нужен исполнитель, чтобы запустить «будущее». Я рекомендую использовать https://github.com/tokio-rs/tokio и читать их документацию.


.await для ожидания функции


async_function().await; Интересный синтаксис, да? На самом деле неплохо, так как вам не нужно заключать его в скобки, как в JS.


Обработка результата


[Это еще один важный вопрос] (https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html). Rust безопасен, поэтому вам нужно со всем справиться. Да, все случаи ошибок в отличие от JS!


Перечисление «Результат» содержит «ОК» и «Ошибка». Если будущее успешно, оно возвращает «ОК», в противном случае «Эрр».


Наиболее полный способ обработки обоих случаев:


пусть f = File::open("hello.txt");


пусть mut f = соответствует f {


Ок(файл) => файл,


Err(e) => вернуть Err(e),


В приведенном выше примере используется [синтаксис сопоставления с образцом, который также хорош] (https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html).


Это довольно многословно, поэтому есть 2 распространенных способа сократить его:


  1. Использование .unwrap()

Пример: let my_value = async_function().await.unwrap();


Это [получает значение успеха и паникует, если Err] (https://stackoverflow.com/a/36362163/3101690)


Используйте это только тогда, когда вы уверены, что это не приведет к ошибке или в тестовой среде.


  1. Использование синтаксиса ?

Это передает ошибку вверх. Таким образом, ваша функция также должна иметь возможность возвращать ошибку (либо Result, либо Option)


[См. это, например, и его эквивалент] (https://stackoverflow.com/a/42921174/3101690)


Право собственности и ссылки


Слышали о кредитной чекер? Здесь мне особо нечего сказать. Это самая сложная вещь в этом списке, поскольку она уникальна для ржавчины. И если вы никогда раньше не работали со ссылками, эта тема может быть немного сложной.


К счастью, книга о ржавчине снова спасает положение.


[В основном: прочитайте части 4.1, 4.2 и 4.3] (https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html)


И это все!


Этот список на самом деле короче, чем я ожидал. Я надеюсь, что это полезно для вашего путешествия.


Видите ошибку или есть предложения? Дай мне знать!


Как то, что вы видите здесь? Найдите [больше моих сообщений] (https://michaelsalim.co.uk/blog/) или [проверьте мой стартап] (https://recalllab.com/).


Также опубликовано [Здесь] (https://michaelsalim.co.uk/blog/rust-from-0-to-80-for-js-dev/)



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE