M

Unveiling Rust: A JavaScript Developer’s Guide to Mastering a New Realm を読んだメモ

Apr 28, 2024

Unveiling Rust: A JavaScript Developer’s Guide to Mastering a New Realm | by Igor Komolov | Mediumを読んでメモ。

  • JavaScriptの開発者が新たにRustを学ぶ際のガイドとなる記事。

  • パッケージマネージャー

    • JavaScriptにおけるnpmのような立ち位置にcargoがある。
      • cargo newでプロジェクト作成できて、cargo runでビルドできる。
  • 所有権

    • メモリー管理についてJavaScriptとは異なるアプローチ。
    • JavaScriptではエンジンによってガベージコレクションで管理されるけど、Rustではメモリー安全性のために所有権モデルを採用している。
    • Rustでは所有権モデルによって、データ毎に廃棄の責任を持つ所有者が存在する。
    • fn main () {
          let a = String::from("Hello world.");
          let b = a;
          println!("{}", a);// 所有権がbに移動したため、aは使用できずにコンパイルエラーになる。
      }
    • メモリーの2重解放のような問題を防ぐことになる。
  • ゼロコスト抽象化

    • Rustはゼロコスト抽象化を提供していて、高レベルの抽象化を使ってもパフォーマンスが低下しない実装が可能となる。
    • traitベースのジェネリクスやイテレーターはゼロコスト抽象化の一例。
  • 並列処理

  • 強力な型システム

    • 型推論があるので常に型定義を書く必要はない。
    • Rustの関数の引数は明示的な型定義が必要。
  • イミュータブル

    • Rustの変数はデフォルトでイミュータブル。
    • let a = 1;
      a = 2; // コンパイルエラーが発生する。
  • パターンマッチング

  • クレートとモジュール

    • JavaScriptと同様にモジュールを使ってコードを整理できる。
    • modキーワードでモジュールを定義し、useキーワードでモジュールをインポートする。
    • // hello.rs
      pub fn hello() {
          println!("Hello, world!");
      }
    • // main.rs
      mod hello;
      use hello::hello;
      
      fn main () {
          hello();
      }
  • エラーハンドリング

    • RustではResult<T, E>Option<T>を使ってエラーハンドリングを明示的に行う。
    • Result - Rust By Example 日本語版
      • Resultは、リッチなバージョンのOption型で, 値の不在の可能性の代わりにエラーの可能性を示します。

    • fn error_fn(i:i32) -> Result<f32,String> {
          if i == 1 {
              Ok(1)
          } else {
              Err(String::from("Error!"))
          }
      }
      
      fn main() {
          let result = error_fn(2);
      
          match result {
              Ok(v) => println!("{}", v),
              Err(e) => println!("{}", e),
          }
      }
  • 非同期プログラミング

    • ノンブロッキングな実行を可能にするために、JavaScriptでも馴染みのあるasyncawaitキーワードを使って非同期プログラミングができる。
      • 非同期プログラミングをサポートしているけど、Tokioのような非同期ランタイムを必要とする。