说我有一个特质:
trait ReactorClient<S : Source + ?Sized> {
fn get_source(&self) -> S;
}
还有一个接受Box的方法
fn register<S : Source + ?Sized>(&self, mut client: Box<dyn ReactorClient<S>>, token: Token, interests: Interest) -> io::Result<()>
在这个方法中,我如何从
Box<dyn ReactorClient<S>>
到 &mut S
?到目前为止,每次尝试都以类似 the size of
S cannot be statically determined
的方式结束。
我尝试了
&mut client.get_source()
、&mut client.as_mut().get_source()
等 - 但没有运气。
感觉从根本上我需要做一些其他事情来避免取消引用 S?
你从根本上犯的错误是,如果你想要一个
&mut S
,你实际上应该返回一个 &mut S
,而不是 S
。
如果您返回 S
的
owned实例,它将不再是
ReactorClient
内部的实例。无论您围绕它写什么,例如 &mut client.get_source()
或 &mut client.as_mut().get_source()
都会改变这一事实。
因此,您应该更改的是
get_source()
函数的返回值到 &mut S
。此外,您可能希望该函数为 &mut self
,否则您无法真正返回 &mut S
。
pub trait Source {}
pub trait ReactorClient<S: Source + ?Sized> {
fn get_source(&mut self) -> &mut S;
}
// A function that demonstrates that our API works:
pub fn foo<S: Source + ?Sized>(mut obj: Box<dyn ReactorClient<S>>) {
// This line demonstrates what you asked for: converting a
// `Box<dyn ReactorClient<S>>` to a `&mut S`
let _s: &mut S = obj.get_source();
}