こんにちは。Rustでソフトウェア開発をしています。
C++でいうテンプレート部分特殊化をRustのコードで実現したいです。
いろんなWebサイトを調べてみました。
しかし問題は解決できません。
forの後の部分(structなど)の部分特殊化についてはいくつか見かけました。ですがforの前部分(trait)の部分特殊化について書かれているところを見つけられませんでした。
問題のコード
rust
1use std::sync::{Arc, Mutex}; 2 3pub trait TryLockAndThen<T, U> 4where 5 T: ?Sized, 6{ 7 type Output; 8 fn run<F>(&self, f: F) -> Self::Output 9 where 10 F: FnOnce(&mut T) -> Self::Output; 11} 12 13impl<T, U> TryLockAndThen<T, U> for Arc<Mutex<T>> 14where 15 T: ?Sized, 16 U: Default, 17{ 18 type Output = U; 19 fn run<F>(&self, f: F) -> Self::Output 20 where 21 F: FnOnce(&mut T) -> Self::Output, 22 { 23 match self.try_lock().as_deref_mut() { 24 Err(_) => { 25 let default = U::default(); 26 return default; 27 } 28 Ok(target) => return f(target), 29 } 30 } 31} 32impl<'a, T, U> TryLockAndThen<T, &'a U> for Arc<Mutex<T>> 33where 34 T: ?Sized, 35 U: Default, 36{ 37 type Output = &'a U; 38 fn run<F>(&self, f: F) -> Self::Output 39 where 40 F: FnOnce(&mut T) -> Self::Output, 41 { 42 match self.try_lock().as_deref_mut() { 43 Err(_) => { 44 let default = U::default(); 45 return &default; 46 } 47 Ok(target) => return f(target), 48 } 49 } 50}
エラーメッセージ
error[E0119]: conflicting implementations of trait `helper::TryLockAndThen<_, &_>` for type `std::sync::Arc<std::sync::Mutex<_>>` --> interactors/src/helper.rs:32:1 | 13 | / impl<T, U> TryLockAndThen<T, U> for Arc<Mutex<T>> 14 | | where 15 | | T: ?Sized, 16 | | U: Default, ... | 30 | | } 31 | | } | |_- first implementation here 32 | / impl<'a, T, U> TryLockAndThen<T, &'a U> for Arc<Mutex<T>> 33 | | where 34 | | T: ?Sized, 35 | | U: Default, ... | 49 | | } 50 | | } | |_^ conflicting implementation for `std::sync::Arc<std::sync::Mutex<_>>`
run
メソッドの戻り値を、U
型と&U
型の両パターンに同じシグネチャで実現したいだけなのですが…
ご存じの方いらっしゃいましたら恐縮ですが、ご教示いただけますと幸いです。
よろしくお願いいたします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/04/06 10:41
2022/04/06 14:58
2022/04/07 23:47