Rust 如何从另一个具有固定自组织的方法调用需要固定自组织的方法?

Rust 如何从另一个具有固定自组织的方法调用需要固定自组织的方法?,rust,rust-pin,Rust,Rust Pin,我正在为一个结构实现Tokio的AsyncRead,但是这个实现只是对一个包含的结构的传递。我最终编译的实现是: use std::pin::Pin; // A simplified version of Tokio's AsyncRead trait Async { fn poll_read(self: Pin<&mut Self>); } struct Inner {} impl Async for Inner { fn poll_read(self

我正在为一个结构实现Tokio的
AsyncRead
,但是这个实现只是对一个包含的结构的传递。我最终编译的实现是:

use std::pin::Pin;

// A simplified version of Tokio's AsyncRead
trait Async {
    fn poll_read(self: Pin<&mut Self>);
}

struct Inner {}

impl Async for Inner {
    fn poll_read(self: Pin<&mut Self>) {
        // Actual implementation would be here
    }
}

struct Outer {
    inner: Inner,
}

impl Async for Outer {
    fn poll_read(self: Pin<&mut Self>) {
        // This is a wrapper implementation, just deferring to inner
        Pin::new(&mut self.get_mut().inner).poll_read()
    }
}

fn main() {
    let mut outer = Outer { inner: Inner {} };
    Pin::new(&mut outer).poll_read()
}
使用std::pin::pin;
//一个简化版的东京异步读取
特质异步{
fn poll_read(self:Pin);
}
结构内部{}
内部的impl异步{
fn poll_read(self:Pin){
//实际执行将在这里进行
}
}
结构外部{
内:内,
}
外部异步的impl{
fn poll_read(self:Pin){
//这是一个包装器实现,只是遵从内部
Pin::new(&mut self.get_mut().inner).poll_read()
}
}
fn main(){
设mut outer=outer{inner:inner{};
引脚::新建(&mut-outer).poll_-read()
}

有些库隐藏了这些pin处理问题的一些细节(例如,请参见中的答案),但我试图了解“幕后”到底发生了什么。我有两个相关的问题:

  • 是否有一种更干净的方法来执行
    Pin::new(&mut self.get_mut().io)。
    ?这似乎是一种特别复杂的方式,向编译器显示固定结构中的结构也是
    Pin

  • 这个实现之所以可能,是因为我的结构是
    Unpin
    (否则我无法调用
    get_mut()
    )。否则我将如何实现这一目标


  • 另请参阅我已编辑添加了MRE,并澄清了为什么其他问题(我没有找到-谢谢)不能完全回答我要找的问题。但后一个问题是判断问题,如果你想以“已经回答”结束这个问题,我会理解。你的问题似乎偏离了不同的方向。链接的问题显示了如何为
    Unpin
    类型执行此操作,并进一步链接到文档以解释其工作原理。这表面上回答了你的第二个问题。您还询问是否有“更清洁”的方法,但尚未描述“更清洁”的含义。您可以创建函数或扩展trait,为您编写一些代码(如另一个问题中的
    poll\u unpin
    方法)。然后,您已经更新了您的问题,以询问“引擎盖下”,这与问题中的任何其他内容都截然不同,范围更广。