2

特性パラメーターを使用して呼び出す必要があるメソッドがあります (それを呼び出しましょうListener)。その理由は、以前にこの特性パラメーターを親構造体に格納したことがあるため、内部にあるBox場合とそうでない場合があるためです。

だから私は2つの方法があります:

  • fref<T>(t: &T) where T: Listener
  • fbox(t: &Box<dyn Listener>)

そして、私は彼らの両方に電話してもらいたいf(t: ??). 今のところ、 と のコードを複製しましたがfreffboxこれは機能しますが、良くありません。fそのため、コードから呼び出して因数分解できるようにfrefするfbox署名を探しています。によって実装された特性の 1 つがBoxa と同等であることを期待していました&(または、少なくともどこかで共通点を見つけます)。

私は次のことを試しました:

  • 書いf<T>(t: &T) where T: Listenerているのに、から呼び出すことができません fboxListenerによって実装されていませんBox<dyn Listener>)。
  • 次に、呼び出しを内側からボックス化解除するように変更しますfboxf(&*t)、そうBox<Listener>tはないため、Sizeできません。

  • 書いf<T>(t: &T) where T: std::borrow::Borrow<Listener>ているが、から呼び出すことができないfrefBorrowはによって実装されていない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);
}
4

1 に答える 1