具有期货 TryStream 和 SNAFU 上下文的意外返回类型

Posted

技术标签:

【中文标题】具有期货 TryStream 和 SNAFU 上下文的意外返回类型【英文标题】:Unexpected return type with futures TryStream and SNAFU context 【发布时间】:2020-03-22 10:35:51 【问题描述】:

我正在尝试包装一个 INotify Events 的流,但我不是很成功:

pub fn doc_stream(
    &mut self,
) -> Result<impl TryStream<Item = Event<std::ffi::OsString>, Error = Error> + '_, Error> 
    Inotify::init()
        .and_then(|mut inotify| 
            inotify
                .add_watch(
                    self.path.clone(),
                    WatchMask::MODIFY | WatchMask::CREATE | WatchMask::DELETE,
                )
                .map(|_| inotify)
        )
        .context(INotifyError)
        .and_then(move |mut inotify| 
            inotify
                .event_stream(&mut self.buffer[..])
                .context(INotifyError)
                .map(|ts| ts.context(INotifyError))
        )

在这个函数的最后,我调用了inotify.event_stream(...),它返回了类似Result&lt;EventStream, ioError&gt;的东西。通过调用context,它变成了Result&lt;EventStream, Error&gt;,但是EventStream 被定义为Stream&lt;ioResult&lt;Event&gt;&gt;,这相当于(在我的乐观主义者看来)TryStream&lt;Event, ioError&gt;

context() 之后,我希望有Result&lt;TryStream&lt;Event, ioError&gt;, Error&gt;。随着对.map(|ts| ts.context(INotifyError)) 的调用,我现在希望将其变成Result&lt;TryStream&lt;Event, Error&gt;, Error&gt;,但它不是......我有一层Result 太多:Result&lt;TryStream&lt;Result&lt;Event, Error&gt;, Error&gt;, Error&gt;

我怀疑从Stream&lt;Result&lt;Foo, _&gt;&gt; 的变化不会变成TryStream&lt;Foo, _&gt;,而是变成TryStream&lt;Result&lt;Foo, _&gt;, _&gt;,但我不确定...


经过一番调查,我将问题缩小到:

inotify.event_stream(...)

返回验证

impl Stream<Item = Result<Event<std::ffi::OsString>, io::Error>> + '_,

但不验证

impl TryStream<Item = Event<std::ffi::OsString>, Error = io::Error> + '_,

【问题讨论】:

很难回答您的问题,因为它不包含minimal reproducible example。我们无法分辨代码中存在哪些 crate(及其版本)、类型、特征、字段等。如果您尝试在Rust Playground 上重现您的错误,如果可能的话,这将使我们更容易为您提供帮助,否则在全新的 Cargo 项目中,然后在edit 您的问题中包含附加信息。您可以使用Rust-specific MRE tips 来减少您在此处发布的原始代码。谢谢! 【参考方案1】:

Ok 而不是 TryStream 中的 Item 将解决此问题。呵呵!

【讨论】:

以上是关于具有期货 TryStream 和 SNAFU 上下文的意外返回类型的主要内容,如果未能解决你的问题,请参考以下文章

等待具有超时的期货序列,而不会在 TimeoutException 上失败

期货基础知识

-远期和期货价格的确定--课后作业--金融衍生工具

股指期货

揭秘中国商品期货市场的9大重要因子

期货黄金与现货黄金比较