rust - 具有期货 TryStream 和 SNAFU 上下文的意外返回类型
问题描述
我正在尝试包装一个 INotify 流,但Event
我不是很成功:
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
,它变成了 a Result<EventStream, Error>
,但 anEventStream
被定义为 a Stream<ioResult<Event>>
,它(在我的乐观主义者看来)等同于 a 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> + '_,
解决方案
Ok
而不是Item
在 TryStream 中将解决问题。嗬!
推荐阅读
- dynamics-crm - Power Automate 连接到 Dynamics 365/CRM
- java - 如何仅将对象传递给决策表的 ACTION 部分?
- kotlin - 按顺序运行 Kotlin 协程
- c# - .Net Core - IMemoryCache - 使用滑动时间跨度最终到期
- python - 如何在 Raspberry Pi 中加载 tflite 权重
- python - 使用熊猫返回索引超出范围的零
- python - Tkinter 和 GUI 刷新
- r - 将行名和列名分配给许多矩阵
- python - 如何使用pygame在可调整大小的窗口中绘制矩形的边框?
- javascript - 如何通过前缀或键将 JSON 键分组为新键?