質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

379閲覧

Rustで`saturating_add`を使った場合のジェネリクス

susii

総合スコア1

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2022/09/28 02:24

前提

Rustでsaturating_addを使った場合のジェネリクスの書き方がわかりません。

実現したいこと

下記コードの、HogeU32HogeU64をジェネリクスで一つにまとめたいです。

rust

1#[derive(Debug)] 2pub struct HogeU32 { 3 value: u32, 4} 5 6impl HogeU32 { 7 pub fn increase(self, value: u32) -> Self { 8 Self { 9 value: u32::saturating_add(self.value, value), 10 } 11 } 12} 13 14#[derive(Debug)] 15pub struct HogeU64 { 16 value: u64, 17} 18 19impl HogeU64 { 20 pub fn increase(self, value: u64) -> Self { 21 Self { 22 value: u64::saturating_add(self.value, value), 23 } 24 } 25} 26 27fn main() { 28 let mut hu32 = HogeU32{ 29 value: 100, 30 }; 31 32 hu32 = hu32.increase(100); 33 34 println!("{:?}", hu32); 35 36 let mut hu64 = HogeU64{ 37 value: 100, 38 }; 39 40 hu64 = hu64.increase(100); 41 42 println!("{:?}", hu64); 43}

発生している問題

型引数を用いたHoge<T>型の構造体を定義した場合、

rust

1value: u32::saturating_add(self.value, value) 2value: u64::saturating_add(self.value, value)

この部分の、型による振り分けをどう書けばいいのかわかりません。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

u32::saturating_addu64::saturating_add は同じ名前ですがトレイトの実装というわけではなく、単に同じ名前というだけです。 ですからこれを統一的に扱えるトレイトを作れば HogeU32HogeU64 は統合することができます。

rust

1trait SaturatingAdd<Rhs = Self> { 2 type Output; 3 fn saturating_add(self, rhs: Rhs) -> Self::Output; 4} 5 6impl SaturatingAdd for u32 { 7 type Output = Self; 8 fn saturating_add(self, rhs: Self) -> Self::Output { 9 u32::saturating_add(self, rhs) 10 } 11} 12 13impl SaturatingAdd for u64 { 14 type Output = Self; 15 fn saturating_add(self, rhs: Self) -> Self::Output { 16 u64::saturating_add(self, rhs) 17 } 18} 19 20#[derive(Debug)] 21pub struct Hoge<T> { 22 value: T, 23} 24 25impl<T: SaturatingAdd<T, Output = T>> Hoge<T> { 26 fn increase(self, value: T) -> Self { 27 Self { 28 value: self.value.saturating_add(value), 29 } 30 } 31} 32 33fn main() { 34 let mut hu32 = Hoge::<u32> { value: 100 }; 35 36 hu32 = hu32.increase(100); 37 38 println!("{:?}", hu32); 39 40 let mut hu64 = Hoge::<u64> { value: 100 }; 41 42 hu64 = hu64.increase(100); 43 44 println!("{:?}", hu64); 45}

投稿2022/09/28 09:07

SaitoAtsushi

総合スコア5466

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

susii

2022/09/28 12:29

統一的に扱えるトレイトを作るという発想がありませんでした。 とても勉強になりました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問