Open13

Rust 初心者勉強メモ

yumechiyumechi

まずここ見てインストール curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh するだけ。
https://www.rust-lang.org/tools/install

環境は今のところ Windows 11 Home 21H2 22000.51 で、WSL2を使用している。

ダメそうなら Windows 側に入れて進めるかも。

yumechiyumechi

https://doc.rust-lang.org/book/title-page.html を読み始める。

  • とりあえず hello, world ! できた
    • rustc でやってもできたし、cargoでやってもできた
  • CLionの設定は見直し中
    • やはり相変わらず WSL2 上の実行環境を見ていない気がする
    ~/work/github.com/yumechi/rust_practice  on   main ?3                                                                         at k3d-demo ⎈  at 19:15:19 
❯ rustc src/hello_world/main.rs

    ~/work/github.com/yumechi/rust_practice  on   main ?3                                                                         at k3d-demo ⎈  at 19:15:24 
❯ ./main
こんぺこ~

コード

fn main() {
    println!("こんぺこ~");
}
yumechiyumechi

CLionがWSL2上のcargoのパスを読まないので、やっぱり windows 側にもインストーラーで入れる。仕方がない。

yumechiyumechi

Windows を入れるにあたって、C++のbuild ツールが必要。ホームページにも書いてあるが、下記のブログで気が付く。

https://rust.design/2020/09/05/rustでlink-exeのエラー/

ところが一生エラーになる。エラーが起こっているパッケージ名を見つつ、下記のサイトを見て確認する。

https://docs.microsoft.com/en-us/answers/questions/71632/visual-c-vc-runtimeminimum-x64msi-error.html

MicroSoftからリカバリ用のツールをダウンロードして、影響がありそうなものを32bit, 64bit版の両方で消す。

そのあとビルドツールを入れ、Windows Updateして再起動したら C++ のビルドツール導入に成功していた。

RustもWindows側のものを見てビルド成功するようになった。

yumechiyumechi

気になるポイント

  • Result型が早くも出てくる
  • mut &guess という所有権に絡みそうな渡し方
  • match式めっちゃ使ってることに今更気が付く
    • Scalaちょっと勉強してたけど、めっちゃ便利だなと改めて思う

CLionの補完の利きが悪いのでどこかで調査したい、IDE使ってるメリットが薄くなってしまう

yumechiyumechi

Chapter3やってる、日本語版と英語版のdiffが結構ある。ないもののメモとしては下記。

https://github.com/yumechi/rust_practice/commit/aa2887754646edb067ef51f57fa8953568b5028c

気になるポイントは下記

  • 変数の再定義と、シャドーイングが有効な言語である
  • 数値の比較にしろ、実数と整数の比較ができない
  • ブロックを使って評価値を得ることができる
  • forなどに使う range や iter は完備されている、逆順でほしい場合は rev を使う
yumechiyumechi

chapter4

  • 厳格に所有権が管理されている
  • 整数型など一部の型については関係がない(バイト数が固定できるもののみ)
  • 所有権を渡すか、参照を渡すかを強く意識する必要がある
    • 間違えるとコンパイラが怒ってくれる
  • 複数の値を返すこともできる
  • 文字列の扱いはスライスを使うと楽
    • 活用していく
  • Stringとstrの使い分け?違い?が今わかってない

https://github.com/yumechi/rust_practice/commit/6e57a2c0948840304a597e7fb8ea0db79aa84355

yumechiyumechi

chapter 5

  • 構造体は struct で定義
  • 別の構造体の値を引っ張ってくることができる(すげー)
  • 構造体に入れる実装は impl で定義する
    • オブジェクト指向っぽくできますね
  • implは分割できる
  • 構造体を println したいときは構造体に debug の derive を付与しなければいけない。下記みたいな感じ
// 構造体は derive を入れないと print できない
#[derive(Debug)]
struct Idol {
  name: String,
  Age: u32,
}

https://github.com/yumechi/rust_practice/commit/0c89ea6f23835ec8142f68065fabd9c35068e982

yumechiyumechi

Chapter 7

  • cargo new --lib でライブラリとしてプロジェクトを作れる
  • Rustはデフォルト非公開、pubキーワードで外部からのアクセスを可能にする
    • かなり厳格な印象
    • 構造体の場合だと、プロパティーレベルで公開非公開を制御できる
      • なので構造体を公開してもアクセスできないプロパティなどが存在することになる
  • useはそのファイル内で定義されたのか、別のファイルで定義されたものなのかわかる程度にインポートしたほうが読みやすい
  • useした型名が被った場合は as などで別名をつけて回避できる
  • まとめて use する方法や、 * を使った use もある
    • 他言語でもあるような方法
  • ファイルの分割ができる

https://github.com/yumechi/rust_practice/commit/5fe5262a6f7405d28a1ba2da1ccea207df627873

https://github.com/yumechi/rust_practice/commit/e91b44bd0b3123268a2b002fd8880de7ba8ee38d

yumechiyumechi

Chapter 8.1, 8.2

  • ベクタの性質について
    • new するなら型指定必要
    • vec! マクロでも簡単に作れる
    • 添え字記法は存在しない添え字を指すと panic する、そういうことがありそうな場合は get する
    • 要素を参照すると、pushできなくなる
    • ベクタの解放と共に要素も解放される
    • 順次アクセスするなら for i in &v { } とかが楽
    • Enumを使った複数の方の保持も可能
  • 文字列
    • Stringstr の違いに注意
    • 文字列の更新時、ムーブされて使えなくなるケースに注意
    • 文字列の連結は format! を使う手もある(所有権も奪わないので便利)
    • 文字列の添え字アクセスはコンパイルエラーになる
      • 1文字目の文字がとりたいのか、1文字目のバイト値がとりたいのか不定であるため
      • 無理やり一文字の char の値とか取れなくもない &hello.bytes().nth(0) とかで取れる。 そのあと unwrap() 等が必要ではある
      • 合字などを考えた際に添え字を中まで見る必要があるので、パフォーマンス的に O(1) でないことがあるので、実装してない

いったんここまで

https://github.com/yumechi/rust_practice/commit/98a2567407a73f6356b7e1398eb76563385b2cb3