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におけるnpmのような立ち位置にcargoがある。
-
所有権
- メモリー管理についてJavaScriptとは異なるアプローチ。
- JavaScriptではエンジンによってガベージコレクションで管理されるけど、Rustではメモリー安全性のために所有権モデルを採用している。
- Rustでは所有権モデルによって、データ毎に廃棄の責任を持つ所有者が存在する。
-
fn main () { let a = String::from("Hello world."); let b = a; println!("{}", a);// 所有権がbに移動したため、aは使用できずにコンパイルエラーになる。 }
- メモリーの2重解放のような問題を防ぐことになる。
-
ゼロコスト抽象化
- Rustはゼロコスト抽象化を提供していて、高レベルの抽象化を使ってもパフォーマンスが低下しない実装が可能となる。
trait
ベースのジェネリクスやイテレーターはゼロコスト抽象化の一例。
-
並列処理
- 所有権によってデータ競合の心配がない。
Arc
やMutex
を用いてスレッド間でデータを共有する。
-
強力な型システム
- 型推論があるので常に型定義を書く必要はない。
- Rustの関数の引数は明示的な型定義が必要。
-
イミュータブル
- Rustの変数はデフォルトでイミュータブル。
-
let a = 1; a = 2; // コンパイルエラーが発生する。
-
パターンマッチング
- 複雑なデータ構造を分解する強力なメカニズム。
-
Rustにおけるマッチは、包括的です: 全てのあらゆる可能性を網羅し尽くさなければ、コードは有効にならないのです。
-
クレートとモジュール
- 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), } }
- Rustでは
-
非同期プログラミング
- ノンブロッキングな実行を可能にするために、JavaScriptでも馴染みのある
async
とawait
キーワードを使って非同期プログラミングができる。- 非同期プログラミングをサポートしているけど、Tokioのような非同期ランタイムを必要とする。
- ノンブロッキングな実行を可能にするために、JavaScriptでも馴染みのある