###### 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