rust - 如何获取对 RwLock 内对象的引用?
问题描述
此代码有效:
use serde::{Deserialize, Serialize};
use std::sync::{RwLock, Arc};
use ron;
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
struct Foo {
first: u8,
second: u16,
}
fn main() {
let foo = Foo {first: 1, second: 2};
let lock = Arc::new(RwLock::new(foo));
let state = lock.read().unwrap().clone(); // FIXME: remove clone()
let string = ron::ser::to_string(&state).unwrap();
println!("{}", string);
}
我想摆脱我的程序中的.clone()
as foo
100MB+,我需要多次引用这个参考。
当我摆脱时,.clone()
我得到了错误:
error[E0277]: the trait bound `std::sync::RwLockReadGuard<'_, Foo>: _::_serde::Serialize` is not satisfied
--> src/bin/sandbox7.rs:16:35
|
16 | let string = ron::ser::to_string(&state).unwrap();
| ^^^^^^ the trait `_::_serde::Serialize` is not implemented for `std::sync::RwLockReadGuard<'_, Foo>`
|
::: /home/chris/.cargo/registry/src/github.com-1ecc6299db9ec823/ron-0.6.0/src/ser/mod.rs:25:8
|
25 | T: Serialize,
| --------- required by this bound in `ron::ser::to_string`
我想序列化foo
(从另一个线程,在真实代码中,因此是 Arc)。
我怎样才能得到一个&Foo
从lock
,没有浪费.clone()
?
解决方案
RWLockReadGuard
derefs到基础类型。
操场上没有ron
,所以我无法确定,但这应该可以解决问题:
let state = lock.read().unwrap();
let string = ron::ser::to_string(&*state).unwrap();
推荐阅读
- javascript - 如何使用 node.js 向前端发送成功状态代码?
- java - JPA Hikari 事务管理面临的问题
- java - Android Nearby Connections 无法连接到设备。总是返回 8011
- python - Xaviar 不实时处理?我该如何改进它?
- reason - 重新编写大写组件
- netsuite - NetSuite - 子列表字段作为链接
- mysql - 如何动态创建mysql数据库记录
- r - 如何自定义 Plotly/R/ggplot2 动画断点(帧间距、持续时间)
- android - 如何让 logcat 在 Flutter 项目的 Intellij Idea 上工作?
- r - 如何将两个不同的 ID 协调为一个,然后应用于具有两个 ID 的 df,但在 R 中只计算一次主题?