特性パラメーターを使用して呼び出す必要があるメソッドがあります (それを呼び出しましょうListener
)。その理由は、以前にこの特性パラメーターを親構造体に格納したことがあるため、内部にあるBox
場合とそうでない場合があるためです。
だから私は2つの方法があります:
fref<T>(t: &T) where T: Listener
fbox(t: &Box<dyn Listener>)
そして、私は彼らの両方に電話してもらいたいf(t: ??)
. 今のところ、 と のコードを複製しましたがfref
、fbox
これは機能しますが、良くありません。f
そのため、コードから呼び出して因数分解できるようにfref
するfbox
署名を探しています。によって実装された特性の 1 つがBox
a と同等であることを期待していました&
(または、少なくともどこかで共通点を見つけます)。
私は次のことを試しました:
- 書い
f<T>(t: &T) where T: Listener
ているのに、から呼び出すことができませんfbox
(Listener
によって実装されていませんBox<dyn Listener>
)。 次に、呼び出しを内側からボックス化解除するように変更します
fbox
がf(&*t)
、そうBox<Listener>
でt
はないため、Size
できません。書い
f<T>(t: &T) where T: std::borrow::Borrow<Listener>
ているが、から呼び出すことができないfref
(Borrow
はによって実装されていないListener
)- と同じ
AsRef<Listener>
Deref
遊び場での最後の試み:
trait Listener {}
struct Mouse {}
impl Listener for Mouse {}
fn fbox(t: &Box<Listener>) {
f(t);
}
fn fref<T>(t: &T)
where
T: Listener,
{
f(t);
}
fn f<T>(_t: &T)
where
T: std::ops::Deref<Target = Listener>,
{
}
fn create_listener() -> impl Listener {
Mouse {}
}
fn main() {
let mouse = create_listener();
let box_mouse: Box<Listener> = Box::new(Mouse {});
fref(&mouse);
fbox(&box_mouse);
}