具有期货 TryStream 和 SNAFU 上下文的意外返回类型
Posted
技术标签:
【中文标题】具有期货 TryStream 和 SNAFU 上下文的意外返回类型【英文标题】:Unexpected return type with futures TryStream and SNAFU context 【发布时间】:2020-03-22 10:35:51 【问题描述】:我正在尝试包装一个 INotify Event
s 的流,但我不是很成功:
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<EventStream, ioError>
的东西。通过调用context
,它变成了Result<EventStream, Error>
,但是EventStream
被定义为Stream<ioResult<Event>>
,这相当于(在我的乐观主义者看来)TryStream<Event, ioError>
。
在context()
之后,我希望有Result<TryStream<Event, ioError>, Error>
。随着对.map(|ts| ts.context(INotifyError))
的调用,我现在希望将其变成Result<TryStream<Event, Error>, Error>
,但它不是......我有一层Result
太多:Result<TryStream<Result<Event, Error>, Error>, Error>
。
我怀疑从Stream<Result<Foo, _>>
的变化不会变成TryStream<Foo, _>
,而是变成TryStream<Result<Foo, _>, _>
,但我不确定...
经过一番调查,我将问题缩小到:
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 上下文的意外返回类型的主要内容,如果未能解决你的问题,请参考以下文章