Open4

Rust学習日記

kodekode

7/14

学習に使うサイト

https://doc.rust-jp.rs/book-ja/foreword.html

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
kodekode

7/15

可変参照(&mut)が存在すると、他の参照は作れない

  • 例えば、可変参照(&mut)が1つあると、同じ参照先に対する別の不変参照でも可変参照でも作ることはできない

Result

  • read_lineメソッド
    • 返り値はio::Resultを返す
  • 返り値には、汎用的なResultを返す場合もあれば、サブモジュール用にio::Resultといった特殊な型を返す場合もある
    • これらのResult型はenum型と呼ばれ、列挙型とも呼ばれる
kodekode

9/6

let mut guess = String::new();

上記は、string型の変数を作成したことを意味する。

  • stdin関数は、ターミナルの標準入力へのハンドルを表す型。返り値はstd::io::Stdin

  • read_lineメソッドは、標準入力されたものを文字列に追加する役割を持つ。つまり、引数には可変の文字列が必要。返り値はio::Result。このresultオブジェクトがErrだった場合、エラー処理を実行できる必要がある。

    • エラー処理がなかった場合は、コンパイル時に警告が発生する
  • result型の目的は、エラー処理に関わる情報をエンコードすること。列挙子はOk or Err

  • {}はプレースホルダーであり、{}を記載している順番に応じた変数が格納される

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コマンドでローカルビルドし、ブラウザに表示できる仕組みになっている。
kodekode

9/8

  • cmpメソッドは、比較可能なものであればどれからでも呼び出すことが可能

  • rustは、コンパイル時に型推論を行い、警告を出すことができる

  • 数値型と文字列型を比較できない(JavaScriptみたいに、暗黙的にキャストしてくれる仕組みは存在しない)

  • shadowingと言って、既に定義済みの変数名と同じ名前の変数を定義することが可能。

    • 主に、ある型から別の型に値を変換する時に使われる
  • trimメソッドは、文字列の前後の空白をすべて削除したり、改行文字を削除することができる

parse

parseメソッドは、文字列を様々な数値型へと変換できるため、let guess: u32のように、rustに正確な型情報を伝える必要がある。