首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何插入RefCell内容?

如何插入RefCell内容?
EN

Stack Overflow用户
提问于 2020-01-02 21:09:30
回答 1查看 568关注 0票数 0

我有一个struct MyAsyncStream和tokio::io::AsyncWrite实现:

代码语言:javascript
复制
impl<S: AsyncRead + AsyncWrite + Unpin> AsyncWrite for MyAsyncStream<S> {
    fn poll_write(mut self: Pin<&mut Self>, cx: &mut Context, buf: &[u8]) -> Poll<Result<usize>> {
       ....
    }

我还有MyAsyncStreamWrapper

代码语言:javascript
复制
struct MyAsyncStreamWrapper{inner: MyAsyncStream}

现在,我希望使用以下方法实现MyAsyncStreamWrapper,的AnotherTrait特性:

代码语言:javascript
复制
impl AnotherTrait for MyAsyncStreamWrapper {
    fn poll_send_to<B>(self: Pin<&Self>, cx: &mut Context<'_>, buf: &[u8], addr: B,) -> Poll<Result<usize, Self::Error>> {
        Pin::new(&mut self.inner).poll_write(cx, buf)
    }
    ....
}

在这个方法实现中,我想在内部调用poll_write。但不幸的是,它们在自我可变性上有所不同:Pin<&mut Self> vs Pin<&Self>。正如预期的那样,它不编译。

对于这种情况,是否有一种惯用的“变通办法”?我的想法是将内部封装到Mutex中,这样我就可以在不可变的上下文中拥有可变的MyAsyncStream

代码语言:javascript
复制
MyAsyncStreamWrapper{inner: Mutex<RefCell<MyAsyncStream>>}
...
fn poll_send_to<B>(mut self: Pin<&Self>, cx: &mut Context<'_>, buf: &[u8], addr: B,) -> Poll<Result<usize, Self::Error>> {
       let rc = self.stream.lock().unwrap();
       let ref mut inner  = rc.borrow();
       let pin = Pin::new(inner);

       pin.poll_write(cx, buf);
    }
...

但是,不幸的是,它也没有编译,有以下错误:

代码语言:javascript
复制
     pin.poll_write(cx, buf);
         ^^^^^^^^^^ method not found in `std::pin::Pin<&mut std::cell::RefMut<'_, MyAsyncStream>>`

正确的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-02 21:20:16

那么,重新借用似乎是可行的:

代码语言:javascript
复制
use std::cell::RefCell;
use std::pin::Pin;
use std::sync::Mutex;

fn main() {
    let a = Mutex::new(RefCell::new(42));
    let rc = a.lock().unwrap();
    let mut inner = rc.borrow_mut();
    let pinned = Pin::new(&mut *inner);
    print_type_name(pinned);
}

fn print_type_name<T>(_: T) {
    println!("{}", std::any::type_name::<T>());
}

它输出类型为core::pin::Pin<&mut i32>

尽管如此,在异步上下文中使用阻塞同步原语(如Mutex )可能不是一个好主意。如果可能的话,最好让poll_send_to接受一个Pin<&mut Self>参数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59570046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档