我想从一个流中格式化JSON对象,但是这个流是RwLock中的包装器.因此,以下内容不起作用:

let mut stream:RwLockWriteGuard<'_, I2pStream> = wrapped_stream.write().await; // I2pStream implements the `Read` and `Write` Traits
let iterator = serde_json::Deserializer::from_reader(stream).into_iter::<serde_json::Value>();
for item in iterator {
  // ...
}

...从the trait 'std::io::Read' is not implemented for 'tokio::sync::RwLockWriteGuard<'_, I2pStream>'年开始.我预计RwLockWriteGuard会实现其内容类型实现的所有特征,因为我还可以在写保护上调用read()read_buf(...)等函数(这是Read特征的函数).

那么,有没有办法让编译器知道我的写保护真的实现了std::io::Read特征?或者有没有其他解决方案,比如将写保护包在读取器中?

推荐答案

RwLockWriteGuard<'_, T>go 化为T,因此它获得了T‘S方法的所有内容,但它不会自动实现T实现的特征.问题是serde_json::Deserializer::from_reader需要Read,但只有I2pStream而不是RwLockWriteGuard<'_, I2pStream>实现了Read.

你可以通过简单地强制Deref:serde_json::Deserializer::from_reader(&mut *stream)来解决这个问题;毯子impl<R: Read + ?Sized> Read for &mut R应该足够了.

Rust相关问答推荐

当为a Self:IntoIterator设置trait bind `时,获取`a T `不是迭代器"&'"<'>&'

在泛型 struct 的字段声明中访问关联的Conant

如何在Bevy/Rapier3D中获得碰撞机的计算质量?

获取字符串切片(&;str)上的切片([ia..ib])返回字符串

将数组转换为HashMap的更简单方法

同时从不同线程调用DLL的不同函数会出现分段错误或产生STATUS_STACK_BUFFER_OVERRUN

函数内模块的父作用域的访问类型

如何从ruust中的fig.toml中读取?

将serde_json读入`VEC<;T&>;`( rust 色)时出现问题

为什么`str`类型可以是任意大小(未知大小),而`string`类型的大小应该是已知的?

写入引用会更新基础值,但引用会打印意外的值

了解Rust';s特征对象和不同函数签名中的生存期注释

使用 pyo3 将 Rust 转换为 Python 自定义类型

std mpsc 发送者通道在闭包中使用时关闭

如何在 Rust 中将 Vec> 转换为 Vec>?

Rust Serde 为 Option:: 创建反序列化器

为什么拥有 i32 所有权的函数需要它是可变的?

我如何将 google_gmail1::Gmail> 传递给线程生成?

如何为枚举中的单个或多个值返回迭代器

守卫如何影响匹配语句?