kdnakt blog

hello there.

Rust dojo第10回を開催した

第10回です。

前回はこちら。

kdnakt.hatenablog.com

 

 

[第10回の様子]

2021/09/15に第10回を開催した。

 

内容としてはRust By Example 日本語版の「3.1. 構造体」の演習に取り組んだ。

 

参加者はたぶん全部で8人。ちょっと減ったけど十分な人数。

今回は前回の続きなので、前回と同じメンバーがドライバーを担当。

また、これまで発言のなかったメンバーもナビゲータとして発言してくれて、いい感じの雰囲気になりつつある(気がする)。

 

Slackでのやりとりはかなり減っている。悲しみ。

 

[学んだこと]

  • 3.1. 構造体
  • 演習1:Rectangle の面積を計算する rect_area 関数を追加する
  • 関数はfunだっけfuncだっけ...とかわちゃわちゃしながら、fnを思い出す
  • ネストしたデストラクトってどうやるんだろう?と思いつつ、ネストしてもいけるだろうと適当に書いた
fn rect_area(rectangle: Rectangle) {
  let Rectangle( Point( x1, y1 ), Point( x2, y2 )) = rectangle;
  println!("{}", (x2 - x1) * (y2 - y1));
}
  • しかし、実行結果はコンパイルエラー...
  • 前回のデストラクトは構造体ではなくタプルのデストラクトだったので()を利用していた
  • 今回は構造体のデストラクトなので、{}を使ってさらにStructName { field1: newVariable }のようにする必要があった
fn rect_area(rectangle: Rectangle) {
  let Rectangle { top_left: Point{x: x1, y: y1}, bottom_right: Point{x: x2, y: y2}} = rectangle;
  println!("{}", (x2 - x1) * (y2 - y1));
}

let _rectangle = Rectangle {
    top_left: Point { x: 0.4, y: 10.3 },
    bottom_right: Point { x: 5.2, y: 0.4 },
};

rect_area(_reactangle);
// Total: -47.52
  • コンパイルは通って、実行結果が出力されたが、値がマイナスになってしまった
  • 絶対値を出力する方法を探したら、公式ドキュメントを見つけた:i32.abs()でいけそう

doc.rust-lang.org

  • というわけで最終形がこちら
fn rect_area(rectangle: Rectangle) {
  let Rectangle { top_left: Point{x: x1, y: y1}, bottom_right: Point{x: x2, y: y2}} = rectangle;
  println!("{}", ((x2 - x1) * (y2 - y1)).abs());
}

let _rectangle = Rectangle {
    top_left: Point { x: 0.4, y: 10.3 },
    bottom_right: Point { x: 5.2, y: 0.4 },
};

rect_area(_reactangle);
// Total: 47.52
  • 演習2:oint と f32 を引数とした時に Rectangle を返す square 関数を追加する
  • 返り値はKotlinっぽくfn functionName():型と書きかけるが、以前の回を思い出し正しく->型に修正
  • 返り値を返すときはreturnだっけ?いや最後の;なしにすればいいはず、とかなんとかやって一応形になったのがこちら
fn square(point: Point, len: f32) -> Rectangle {
    Rectangle {
        top_left: Point { x: point.x, y: point.y + len },
        bottom_right: Point { x: point.x + len, y: point.y }
    }
}

print!("{:?}", square(Point{x: 1.0, y: 1.0}, 1.0));
// Rectangle { top_left: Point { x: 1.0, y: 2.0 }, bottom_right: Point { x: 2.0, y: 1.0 } }
  • 座標の計算のときに足すんだけ?引くんだっけ?とかかなりわちゃわちゃしたのは内緒。

 

[まとめ]

モブプログラミングスタイルでRust dojoを開催した。

Rustで長方形の面積計算とか正方形オブジェクトの作成ができるようになった!

 

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

github.com