###### tags: `Rust` `youtube` `cargo` `develop env` # Rust language Crush Course 1 Rustは一般的に、システムプログラミング言語と呼ばれる C, C++, Golang など、高速に動作する実行ファイルを作成する ただし、昨今はWeb Assemblyの登場により、Webプログラミング言語としての用途も増えている [TOC] ## Web assembly 略してwasmともいう Web上で効率的に動作する low level のバイトコード ## その他特徴 - 高速(C++並) - メモリ管理がセキュア - garbage collection を持たない - メモリ管理が必要ない - cargo というパッケージマネージャーがあり、npm のように依存関係やバージョンを管理できる # 1. 準備 1. Rustをインストール 公式サイトのGet Startedのコマンドを実行 `curl https://sh.rustup.rs -sSf | sh` brew でもいい 2. エディタの準備 vscodeを使用 Extension で **Rust(rls)** を使用 vscode がうまく Language Serverを読み込まないときは setting.jsonに以下を書き込む `"rust-client.rlsPath": "/Users/masaharu/.cargo/bin/rls"` また、インストール直後は動かない可能性がある **困ったら 終了 > 再起動** - 普通のRust拡張機能と Rust(rls)の違い rls = rust language server language server は IDEやエディタに補完機能、構文解析等の機能を統一的に提供するために定められた **langage server protcol** のこと rlsはそのrust向け実装 # 2. コードを書き始める(Hello world) 1. からのディレクトリを作成 2. `touch hello.ls` 以下のコード ```rust fn main(){ println!("Hello, world"); } ``` 3. コンパイルする。 `rustc hello.rs` 4. 出力されたバイナリを実行する。 `./hello` # 3. Cargoプロジェクト作成 パッケージやビルドをプロジェクトとして管理しよう 1. プロジェクト初期化 a. 新しいプロジェクトフォルダを作る。`cargo new project` b. 現在フォルダをプロジェクトにする。`cargo init` 2. プロジェクト内のファイルを確認 1フォルダ、2ファイルのシンプルな構成 src : ソースを置くフォルダ .gitignore : targetフォルダと .rs.bk だけ ### Cargo.toml [package] : パッケージ(プロジェクト)の名前やバージョン、作者など [dependencies] : 依存ライブラリ vscode の Better Toml 拡張機能を入れるとハイライトされて見やすい ### /target ディレクトリ コンパイルを実行すると実行ファイルなどが出力されるところ ソース以外はgithubにプッシュされる必要がないので ignoreされている ### src/main.rs エントリーポイント # 4. cargo コマンド cargoプロジェクト内で使えるコマンド ## cargo run `cargo build` と 出力ファイル実行を同時にする ## cargo build targetフォルダへ、コンパイル結果をデバッグ出力 ## cargo build --release リリースビルドする # 5. moduleを使う 別ファイルに書いた fn や class を読み込む ### pub ~ publicな fn や class は別モジュールから呼び出せる ```rust // print.rs pub fn run(){ // print to console println!("Hello from the print.rs file"); } ``` 呼び出すときは、 mod文でimportして c++風にネームスペースを指定して使用する ```rust mod print; fn main() { println!("Hello, world!"); print::run(); } ``` `pub` : パブリック修飾子 `mod ファイル名;` : import文 # 6. println関数 println() : 標準関数の一つ。format出力できる 文字列はそのまま出力できる。 数値は {} で 文字列中にフォーマットで出力(数値でも文字列でもできる) ```rust // print.rs pub fn run(){ // print to console println!("Hello from the print.rs file"); // placeholder を使って文字列や数値を出力 println!("{}", 12345); println!("{} is from {}", "Brad", "Mass"); println!("{0} is from {1} and {0} likes to {2}", "Brad", "Mass", "code"); // 名前付き引数 println!("{name} likes to play {activity}", name = "John", activity="BaseBall"); // 2, 16, 8, 10進数 println!("Binary: {:b} Hex: {:x} Octal: {:o} Decimal: {}", 10, 10, 10, 10); // タプルを出力(デバッグ用) println!("{:?}", (12, true, "hello")); // 計算結果出力 println!("10 + 10 = {}", 10 + 10); } ``` 豆知識. !! : 直前のコマンドを再現 # 7. 変数 ## 変数定義 変数を定義するには `let` を使う ```rust pub fn run() { let name = "Masaharu"; println!("My name is {}", name); } ``` ## 再代入 Rustはデフォルトでは再代入を許可しない。 ```rust= // エラーになる pub fn run() { let name = "Masaharu"; let age = 24; // error : cannot assign twice to immutable variable age = 25; println!("My name is {} and I am {}", name, age); } ``` immutableは不変。つまりconst 値を変更する変数は、 **mut** 修飾子をつける ```rust= pub fn run() { let name = "Masaharu"; let mut age = 24; age = 25; println!("My name is {} and I am {}", name, age); } ``` ## 定数 **const** を使うと、定数を定義できる。 constもデフォルトletも、どちらも再代入を許さないが どういう点が違うのか? ### const - コンパイル前に値が決まっていなければならない - 型も指定しないといけない - 宣言と同時に値も指定 ### let - コンパイル時に値が決まってなくてもいい - 型は自動で推定 - 宣言時に代入しなくていい - 1回だけ代入できる変数みたいな感じ ```rust= pub fn run() { // const const ID: i32 = 001; println!("ID: {}", ID); // let let once; once = 24; println!("{}", once) } ``` ## マルチ代入 pythonのように、() タプルで複数代入できる ```rust= pub fn run(){ let (name, age) = ("masaharu", 24); println("{} is {}", name, age); } ``` # おさらい ## まとめ - インストール方法 - vscode 拡張 - helloworld - プロジェクト構成 - cargoコマンド - module - pub - mod - 標準関数 : println() - 変数 - let - let mut - const - multi assign