我有一个需要使用特征参数调用的方法(我们称之为Listener
)。原因是有时我之前已将此特征参数存储到父结构中,因此它位于 a 内Box
,有时则不在。
所以我有两种方法:
fref<T>(t: &T) where T: Listener
fbox(t: &Box<dyn Listener>)
我希望他们俩都打电话f(t: ??)
。现在我复制了代码,fref
它fbox
可以工作但不好。所以我正在寻找一个签名,f
它可以使它可以从我的代码中调用fref
并fbox
分解我的代码。我希望由实现的特征之一Box
等同于&
(或至少在某处找到共同点)。
我尝试了以下方法:
- 写作
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);
}