💭

[Rustのデザインパターン学習] Newtype [振る舞い]

2023/03/19に公開
1

https://rust-unofficial.github.io/patterns/patterns/behavioural/newtype.html

1. はじめに

  • ChatGPT Plusで最近話題のGPT-4を使用し始めた_5daです。
    • 「RustのデザインパターンNewTypeについて、実装例を3つ作成し解説してください」、
      なんて入力するとそれはばっちりと解説してくれました。

      上記回答をそのまま本記事に転載しませんが、別の形で活用したいと思います。

2. GPT-4の活用例

  • 質問
    • 「RustのNewTypeパターンで作成したオブジェクト同士を比較する方法を教えて」
  • 回答
    • RustのNewTypeパターンでは、新しい型をタプル構造体を使って定義します。

    • オブジェクト同士を比較するために、PartialEqとEqトレイトを実装する必要があります。以下に例を示します。

        // NewTypeパターンで新しい型を定義
      struct Meters(f64);
      
      // `PartialEq`トレイトを実装
      impl PartialEq for Meters {
          fn eq(&self, other: &Self) -> bool {
              self.0 == other.0
          }
      }
      
      // `Eq`トレイトを実装。`PartialEq`が実装されていれば、このトレイトは空でも構いません。
      impl Eq for Meters {}
      
      fn main() {
          let m1 = Meters(5.0);
          let m2 = Meters(5.0);
          let m3 = Meters(10.0);
      
          println!("m1 == m2: {}", m1 == m2); // true
          println!("m1 == m3: {}", m1 == m3); // false
      }
      
    • この例では、Metersという新しい型をタプル構造体で定義しています。PartialEqトレイトを実装することで、Meters型のオブジェクト同士を比較できるようになります。PartialEqが実装されていれば、Eqトレイトは空でも構いません。これにより、オブジェクト同士の比較が可能になります。

2.1. 感想

  • 改善案

    • 先の例でも動くコードを回答してくれたわけですが、#[derive(PartialEq)]と書くほうが良さそうです。
     //トレイトを自動実装
     #[derive(PartialEq)]
     struct Meters(f64);
    
     fn main() {
         let m1 = Meters(5.0);
         let m2 = Meters(5.0);
         let m3 = Meters(10.0);
    
         println!("m1 == m2: {}", m1 == m2); // true
         println!("m1 == m3: {}", m1 == m3); // false
     }
    

3. おわりに

  • 今週発表されたばかりのGPT-4ですが、ぜひ今後の動向に注目したいと思います。
    これから先もどんどん新しい技術が出てきて、これまでの仕事の仕方が変わっていくのは間違いありませんね。
  • うまく活用されている方を見習いながら、with ChatGPTな社会を生き抜いいきたいと思います。

読んで頂きありがとうございました。また次回もよろしくお願いいたします。

Discussion

白山風露白山風露

PartialEqderive_more クレートを使わなくても derive に書けると思います