Rust dojo第4回を開催した

先週に続いて第4回です。

 

kdnakt.hatenablog.com

 

 

[第4回の様子]

2021/08/4に第4回を開催した。

 

内容としてはRust By Example 日本語版の「1.2.2. ディスプレイ」を後半から最後まで読んで演習に取り組んだ。

 

参加者は全部で9人。先週からまた少し減っているが、発言しやすい人数といえばまあそんな感じもする。

とはいえい今日は忘れていた人も多かったようなので次回に期待。

 

今回は、前回終了時に決めておいたメンバーにドライバーをお願いした。今回も終了時にドライバーを指名したので、今後この指名制度が定着していきそう。

 

今扱っているテキストは演習形式ではあるものの、やや内容に飛躍があるので、The Rust Programming Languageの方が良いのでは、という意見もあった。来週相談して決めよう。

f:id:kidani_a:20210806093413p:plain

doc.rust-jp.rs

 

今週も開催前後のSlackでのやりとりがたくさん🎉

 

高収入エンジニア御用達(?)のRustの新しいバージョンが出たみたい。

f:id:kidani_a:20210806094127p:plain

f:id:kidani_a:20210806094250p:plain

 

突撃!Rust dojo

f:id:kidani_a:20210806093925p:plain

f:id:kidani_a:20210806093635p:plain

 

来週は来てね!

f:id:kidani_a:20210806093731p:plain

f:id:kidani_a:20210806093818p:plain

 

[学んだこと]

  • 構造体で名前なしフィールドを2個もつやつは以下のように定義する。シンプルだった

use std::fmt; struct MinMax(i64, i64); impl fmt::Display for MinMax { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "({}, {})", self.0, self.1) } }

  • 名前なしフィールドの場合はDisplayトレイトの実装で、self.0, self.1のようにフィールドをインデックスで出力している
  • 他方、名前ありフィールドの場合は名前で指定してDisplayを実装する形になる
struct Point2D {
    x: f64,
    y: f64,
}

impl fmt::Display for Point2D {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "x: {}, y: {}", self.x, self.y) // この部分
    }
}
  • f64は初登場だけど64ビット浮動小数Javaでいうdoubleとか。
  • ここで以前登場した{:#?}も使ってみたら以下の出力になった
Display: x: 3.3, y: 7.2
Debug: Point2D {
    x: 3.3,
    y: 7.2,
}
  • Point2D {の半角スペースが構造体の定義でスペースなくしたらなくなるのか?と思って実験してもらったが、バイトコードに変換された時点で無視されるようで出力は変わらなかった。
  • 前回か前々回で登場した{:b}fmt::Binaryを実装することで出力できるようになる
  • ドライバの方に手を動かして実装してもらった。
// 出力内容はDisplayのときとおなじ...
impl fmt::Binary for Point2D {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "x: {}, y: {}", self.x, self.y)
    }
}
  • 今日の演習問題は以下の出力を得る構造体を実装するというもの
Display: 3.3 + 7.2i
Debug: Complex { real: 3.3, imag: 7.2 }
  • まずは構造体を定義する:ほぼPoint2D構造体と同じ
#[derive(Debug)]
struct Complex{
    real: f64,
    imag: f64,
}
  • Displayの実装はちょっとだけ変更して以下のように。
impl fmt::Display for Complex {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{} + {}i", self.real, self.imag)
    }
}
  • 動作確認用のコードは以下のようにした。
let complex = Complex { real: 3.3, imag: 7.2 };

println!("Complex:");
println!("Display: {}", complex); // Display: 3.3 + 7.2i
println!("Debug: {:?}", complex); // Debug: Complex { real: 3.3, imag: 7.2 }
println!("Debug: {:#?}", complex);
// Debug: Complex {
//     real: 3.3,
//     imag: 7.2,
// }

 

[まとめ]

モブプログラミングスタイルでRust dojoをやった!

fmt::Displayトレイトもfmt::Binaryトレイトも実装できた(中身は微妙だけど)!

 

今週のプルリクエストはこちら。

github.com