目次
前回の記事はこちら。自分用のメモなので、読みにくいかもです。
第5章
構造体です。勝手知ったるなんとやら?オブジェクト指向的な部分は問題ないかなぁと。
定義とインスタンス化
struct
で定義- インスタンスの生成は引数は順不同でOK
- 構造体のインスタンスを可変にするとフィールドの値も変更可能
- 特定のフィールドのみ可変にすることは不可能
- インスタンス化する関数の最後でreturnなしでインスタンスの返却を暗黙にできる(return書いてほしいな。。。)
- インスタンス化時にフィールド初期化省略記法が可能(これはちょっと便利?)
- 構造体更新記法
..user1
のように、明示的に設定されていない他のフィールドをコピーしてくれる機能あり
タプル構造体
- タプル構造体!?
struct Color(i32, i32, i32);
- いつ使うんだろう?
ユニット様構造体
- ユニット様構造体 = フィールドのない構造体。トレイトを実装したいけどインスタンスで持つ値はない場合に利用
ライフタイム
- 構造体が参照を持つときにライフタイムという話が出てくる。なるほど。
- ライフタイム指定子が必要になる -> 10章での話
プログラム例
- タプルを引数かぁ。タプルは慣れないので構造体作りそう
- Debugトレイトと
{:?}
という書き方derive(Debug)
でデバッグ用のトレイトを自動で実装=継承してくれる{:#?}
だとpretty printになる(改行とか入る)
この辺の便利なトレイとは付録Cにあるらしい。この辺はやりながら覚えるしかないか。
メソッド記法
- 最初の引数は必ず
self
impl
は構造体とは別の場所に書く = Javaのクラスとは違う
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
}
- 参照じゃない
self
も使えるらしい。どういうときに使うんだろう?
関連関数
self
なしの関数をimplにかける。Javaのスタティックメソッドみたいな感じ
その他
impl
ブロックがあちこちにかける。これはつらいな。。。- 2つにわかれた
impl
ブロックに同じメソッドを書いてみたら、CLionのプラグインではエラーを検知してもらえなかった。- cargo buildではきちんとエラーが表示された。
-
複数のimplブロックが有用になるケースは第10章で見ますが、そこではジェネリック型と、トレイトについて議論します。
- 人の構造体に自分のトレイトを適用したりもできる。
実験
スコープとかどうなりそう?って実験もしてみた。
fn main() {
trait Hoge {
fn trim(&self);
}
impl Hoge for String {
fn trim(&self) {
println!("hogehoge {}", &self);
}
}
let c = String::from("hoge");
c.trim();
println!("{}", fuga(&c));
}
fn fuga(d: &String) -> &str {
d.trim()
}
出力はこんな感じ
hogehoge hoge
hoge
まとめ
気になったのは以下の点。そのうち分かるようになってくるのかな。
- 構造体更新記法はどういったときに使うのを想定して作ったんだろう?とか
- 可変長引数はマクロじゃないとだめ
comments powered by Disqus
See Also by Hugo
- Rust the book - 第10章
- Rust the book - 第6章
- Rust the book - 第9章
- Rust the book - 第8章
- Rust the Bookを読み始めた