Rust学習日記
7/14
学習に使うサイト
Cargo
- CargoはRustのパッケージマネージャー兼ビルドツール
rustup
- Rustが公式に出しているインストーラー
println
- 略は、print line。1行で表示する関数ということ。
! とは
-
!
を使うと、通常の関数ではなく、マクロを呼び出している
rustc
-
rustc ${ファイル名}
を実行でコンパイルし、バイナリの実行可能ファイルを出力 -
./${ファイル名。拡張子なし}
を実行でバイナリファイルを実行
算術的な用法では二進法のことであるが、情報技術においては、コンピュータが直接的に処理するために2進数で表現されるデータ(バイナリデータ)のことを指して用いられる。(Wikipediaより)
cargo.toml
- toml形式でcargoの設定フォーマット
クレート
- rustでは、パッケージのことをクレートと言う
スペース
- rustのファイルでは、タブ4つ分空けるのが通常
Cargo.lock
- プロジェクト内の正確なバージョンを指定している
cargoコマンド
-
cargo new ${プロジェクト名}
: ${プロジェクト名}を作成する -
cargo build
:.rs
ファイルをビルドする(rustc
コマンドでビルドするよりめっちゃ早い) -
cargo run
:.rs
ファイルをビルド&実行する -
cargo check
: バイナリを生成せずにビルドを実行し、エラー がないか確認する
Cargoは、ビルドの生成物をコードと同じディレクトリに置かない。
代わりにtarget/debug
ディレクトリに格納する
- プロジェクトをリリースする際は、
cargo build --release
を使い、最適化した状態でコンパイルされる- この際、実行ファイルを、
target/debug
ディレクトリ配下ではなく、target/release
ディレクトリ配下に置く
- この際、実行ファイルを、
std::io
-
io
モジュールには、入出力を行う時に必要となる一般的なものが含まれている-
io
ライブラリはstd
という標準ライブラリに含まれている
-
コメントアウト
// コメントアウト
JavaScriptと同じですね
Rust
- 標準ライブラリの一部は、全てのプログラムのスコープで使える
- これらのセットを**プレリュード(prelude)**という
- 使いたい型がpreludeにない場合は、その型を
use
文で明示的にスコープに入れる必要がある
変数定義
rustの変数は、デフォルトで不変(immutable)
let apple = 5;
上記の例では、apple
という変数が5
という値に固定されています。
もし、可変(mutable)な変数を定義したい場合は、変数の頭にmut
をつけます
let mut banana = 10;
関連関数
関連関数とは、ある型に対して実装される関数のこと
let mut guess = String::new;
ここでは、型(String)に対してnewインスタンスが実装されている
&
-
&
を使うことで、変数を参照することができる。(※Cでいうところのポインタ的な?) - これによって、元の値を複製することなく、メモリを無駄に使わなくて済む
- 参照も、デフォルトは不変(immutable)なので、以下のように
mut
をつける必要がある
&mut guess
7/15
&mut
)が存在すると、他の参照は作れない
可変参照(- 例えば、可変参照(
&mut
)が1つあると、同じ参照先に対する別の不変参照でも可変参照でも作ることはできない
Result
-
read_line
メソッド- 返り値はio::Resultを返す
- 返り値には、汎用的なResultを返す場合もあれば、サブモジュール用にio::Resultといった特殊な型を返す場合もある
- これらのResult型はenum型と呼ばれ、列挙型とも呼ばれる
9/6
let mut guess = String::new();
上記は、string型の変数を作成したことを意味する。
-
stdin
関数は、ターミナルの標準入力へのハンドルを表す型。返り値はstd::io::Stdin
。 -
read_line
メソッドは、標準入力されたものを文字列に追加する役割を持つ。つまり、引数には可変の文字列が必要。返り値はio::Result
。このresultオブジェクトがErr
だった場合、エラー処理を実行できる必要がある。- エラー処理がなかった場合は、コンパイル時に警告が発生する
-
result
型の目的は、エラー処理に関わる情報をエンコードすること。列挙子はOk
orErr
。 -
{}
はプレースホルダーであり、{}
を記載している順番に応じた変数が格納される
let x = 5;
let y = 10;
println!("x = {} and y = {}", x, y);
上記の表示結果はx = 5 and y = 10
となる。
Cargoの外部クレート連携方法
[dependencies]
crate = "0.0.0"
上記の"0.0.0"は、セマンティックバージョニングと呼ばれる記法である。Rustでは"0.0.0"と書くと、実際には"^0.0.0"の省略形として解釈される。
ただし、Cargo.lock
というファイルに記載されたバージョンは、そのまま固定になるため、意図的にバージョンを上げなければ、Cargo.lock
に記載されているバージョンと全く同じものを使い続ける。
外部依存を持つと、cargoは*crates.ioのコピー(= レポジトリ)から必要なデータを取得する。
※crates.ioとは、rustのOSSのソースを投稿する場所のこと
- トレイト=あるメソッドを使う際に、そのスコープ内に記載する必要があるもの(後の章で解説されるらしい)。cargoは、すべてのトレイトのドキュメントを
cargo doc --open
コマンドでローカルビルドし、ブラウザに表示できる仕組みになっている。
9/8
-
cmpメソッドは、比較可能なものであればどれからでも呼び出すことが可能
-
rustは、コンパイル時に型推論を行い、警告を出すことができる
-
数値型と文字列型を比較できない(JavaScriptみたいに、暗黙的にキャストしてくれる仕組みは存在しない)
-
shadowingと言って、既に定義済みの変数名と同じ名前の変数を定義することが可能。
- 主に、ある型から別の型に値を変換する時に使われる
-
trimメソッドは、文字列の前後の空白をすべて削除したり、改行文字を削除することができる
parse
parseメソッドは、文字列を様々な数値型へと変換できるため、let guess: u32
のように、rustに正確な型情報を伝える必要がある。