Open13
Rust 初心者勉強メモ
まずここ見てインストール curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
するだけ。
環境は今のところ Windows 11 Home 21H2 22000.51 で、WSL2を使用している。
ダメそうなら Windows 側に入れて進めるかも。
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!("こんぺこ~");
}
CLionがWSL2上のcargoのパスを読まないので、やっぱり windows 側にもインストーラーで入れる。仕方がない。
Windows を入れるにあたって、C++のbuild ツールが必要。ホームページにも書いてあるが、下記のブログで気が付く。
ところが一生エラーになる。エラーが起こっているパッケージ名を見つつ、下記のサイトを見て確認する。
MicroSoftからリカバリ用のツールをダウンロードして、影響がありそうなものを32bit, 64bit版の両方で消す。
そのあとビルドツールを入れ、Windows Updateして再起動したら C++ のビルドツール導入に成功していた。
RustもWindows側のものを見てビルド成功するようになった。
とりあえず2章まで
気になるポイント
- Result型が早くも出てくる
-
mut &guess
という所有権に絡みそうな渡し方 - match式めっちゃ使ってることに今更気が付く
- Scalaちょっと勉強してたけど、めっちゃ便利だなと改めて思う
CLionの補完の利きが悪いのでどこかで調査したい、IDE使ってるメリットが薄くなってしまう
Chapter3やってる、日本語版と英語版のdiffが結構ある。ないもののメモとしては下記。
- Overflowに関して release ビルド時の説明
- 配列の初期化
let a = [3; 5];
- indexを超えてしまうことによる runtime error に関する話
- formatが異なる
-
cargo fmt -- --emit files
をこまめにしたほうがよさそう
-
- Returning Values from Loops
気になるポイントは下記
- 変数の再定義と、シャドーイングが有効な言語である
- 数値の比較にしろ、実数と整数の比較ができない
- ブロックを使って評価値を得ることができる
- forなどに使う range や iter は完備されている、逆順でほしい場合は rev を使う
chapter4
- 厳格に所有権が管理されている
- 整数型など一部の型については関係がない(バイト数が固定できるもののみ)
- 所有権を渡すか、参照を渡すかを強く意識する必要がある
- 間違えるとコンパイラが怒ってくれる
- 複数の値を返すこともできる
- 文字列の扱いはスライスを使うと楽
- 活用していく
- Stringとstrの使い分け?違い?が今わかってない
chapter 5
- 構造体は struct で定義
- 別の構造体の値を引っ張ってくることができる(すげー)
- 構造体に入れる実装は impl で定義する
- オブジェクト指向っぽくできますね
- implは分割できる
- 構造体を println したいときは構造体に debug の derive を付与しなければいけない。下記みたいな感じ
// 構造体は derive を入れないと print できない
#[derive(Debug)]
struct Idol {
name: String,
Age: u32,
}
Chapter 6
- enumは結構柔軟な形にできる
- enumの定義値の中に複数の値を渡すとか
- ドキュメントのサンプルを見直して実際の例を見た方が良い
- Optional型
- SomeとNoneで表現する
-
T + Optional<T>
は失敗するので unwrap する必要がある
- match, if let がある
- 他の言語と同じような使い方
Chapter 7
-
cargo new --lib
でライブラリとしてプロジェクトを作れる - Rustはデフォルト非公開、pubキーワードで外部からのアクセスを可能にする
- かなり厳格な印象
- 構造体の場合だと、プロパティーレベルで公開非公開を制御できる
- なので構造体を公開してもアクセスできないプロパティなどが存在することになる
- useはそのファイル内で定義されたのか、別のファイルで定義されたものなのかわかる程度にインポートしたほうが読みやすい
- useした型名が被った場合は
as
などで別名をつけて回避できる - まとめて use する方法や、
*
を使った use もある- 他言語でもあるような方法
- ファイルの分割ができる
- 定義と実装を別のファイルに書ける感じ
- 同名のフォルダで切って定義する的な
- 読み方を覚えないと難しそう
-
https://doc.rust-jp.rs/book-ja/ch07-05-separating-modules-into-different-files.html
- これをよく読んどく
- 定義と実装を別のファイルに書ける感じ
Chapter 8.1, 8.2
- ベクタの性質について
- new するなら型指定必要
-
vec!
マクロでも簡単に作れる - 添え字記法は存在しない添え字を指すと panic する、そういうことがありそうな場合は
get
する - 要素を参照すると、pushできなくなる
- ベクタの解放と共に要素も解放される
- 順次アクセスするなら
for i in &v { }
とかが楽 - Enumを使った複数の方の保持も可能
- 文字列
-
String
とstr
の違いに注意 - 文字列の更新時、ムーブされて使えなくなるケースに注意
- 文字列の連結は
format!
を使う手もある(所有権も奪わないので便利) - 文字列の添え字アクセスはコンパイルエラーになる
- 1文字目の文字がとりたいのか、1文字目のバイト値がとりたいのか不定であるため
- 無理やり一文字の char の値とか取れなくもない
&hello.bytes().nth(0)
とかで取れる。 そのあとunwrap()
等が必要ではある - 合字などを考えた際に添え字を中まで見る必要があるので、パフォーマンス的に
O(1)
でないことがあるので、実装してない
-
いったんここまで