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

64jmpszr  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(120)

假设我有一个特质:

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的引用?

wfveoks0

wfveoks01#

从根本上说,你错了,如果你想有一个&mut S,你应该返回一个&mut S,而不是一个S
如果返回一个Sowned示例,它将不再是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();
}

相关问题