如何获取 Box 内容的可变引用<dyn T>?

问题描述 投票:0回答:1

说我有一个特质:

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?

generics rust traits
1个回答
0
投票

你从根本上犯的错误是,如果你想要一个

&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();
}
© www.soinside.com 2019 - 2024. All rights reserved.