- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个调用 serde_json::to_writer
的函数两次写两件事,但我不知道怎么写。
这是一次尝试 ( playground link ):
extern crate serde_json;
fn main() {
let mut out = std::fs::File::create("out.txt").unwrap();
write_stuff(&mut out);
}
fn write_stuff<W: ?Sized>(out: &mut W) -> Result<(), std::io::Error>
where
W: std::io::Write,
{
serde_json::to_writer(out, &1).unwrap(); // `out`: value moved here
serde_json::to_writer(out, &2).unwrap(); // `out`: value used here after move
Ok(())
}
编辑:想出了一个编译的方法,但是有没有更简单的方法(playground link):
extern crate serde_json;
fn main() {
let mut out = std::fs::File::create("out.txt").unwrap();
write_stuff(&mut out);
}
fn write_stuff<W: ?Sized>(out: &mut W)
where
W: std::io::Write,
{
write_wrapper(out);
write_wrapper(out);
}
fn write_wrapper<W: ?Sized>(out: &mut W)
where
W: std::io::Write,
{
serde_json::to_writer(out, &1).unwrap();
}
最佳答案
这种行为的原因有些微妙。当将共享引用作为参数传递给函数时,Rust 将简单地复制引用。 &T
类型对于所有 T
都是Copy
,因为我们可以同时拥有任意数量的共享引用。
另一方面,可变引用不是Copy
,因为在任何给定时间只能有一个。根据非 Copy
类型的常用 Rust 语义,这意味着可变引用在作为参数传递时应该移动。那么为什么这段代码有效呢?
fn foo(_: &mut i32) {}
fn main() {
let mut i = 42;
let r = &mut i;
foo(r);
foo(r);
}
原因是编译器在分配给显式声明为可变引用的变量时创建一个隐式重借,因此函数调用被转换为 foo(&mut *r )
。这将创建一个仅在函数调用期间持续的新借用,一旦重新借用的生命周期结束,原始引用 r
将再次可用。
但是,隐式重借仅针对使用可变引用类型显式声明的变量生成。如果我们将上面的 foo()
的定义更改为
fn foo<T>(_: T) {}
代码将停止编译。现在 foo()
的参数不再声明为可变引用,因此编译器不会引入隐式重借,并将 r
的所有权转移到函数中而是第一次调用,导致第二次函数调用出错。
同样的事情发生在你的代码中。函数 to_writer()
声明为
pub fn to_writer<W, T: ?Sized>(writer: W, value: &T) -> Result<()>
where
W: io::Write,
T: Serialize,
由于参数 writer
没有被声明为可变引用,你需要创建一个显式的 reborrow 来避免移动:
serde_json::to_writer(&mut *out, &1)?;
您在问题中给出的替代解决方案同样有效——write_wrapper()
函数接收一个显式声明的可变引用作为参数,因此对该函数的调用会触发隐式重借。
关于rust - 如何使用相同的可变借用调用 serde_json::to_writer 两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58316486/
存在生命周期和 serde::deserialize 问题。尝试阅读错误消息并尝试实现反序列化,但随后出现错误,我需要实现反序列化。 没有生命周期,它可以工作 use serde::{ Deseria
我有一些来自外部 API 的 json,我想输入。数据的形状如下所示: { "summary": { "field1": "foo", "field2": "bar", },
所以我有一个来自某处的 serde Value,我想在之后反序列化之前向 Value 添加额外的“字段”。我正在查看文档,但不知道该怎么做。 更具体地说,假设我有一个 HashMap,我想将其值合并到
我希望能够序列化 Vec作为 JSON(和其他基于 UTF-8 的格式)的 base64 编码字符串,同时保留二进制序列化格式的字节数组。 #[derive(Serialize, Deserializ
我写了一个测试用例: use serde::{Serialize, Deserialize}; use std::collections::BTreeMap; use std::fmt; #[deri
我的意思是,如果 2 个对象在某些属性上重叠,是否有办法尝试匹配 全部 其中? 例如: use serde::{Serialize, Deserialize}; use serde_json; //
我有一个用例,需要将 JSON 反序列化为“远程”(在另一个 crate 中定义)结构的映射。我在这方面经历了一段可笑的困难时期,所以我一定错过了一些明显的东西。 以下本质上是所需的最终状态: use
我正在尝试从具有以下维度的 Rust 文件中读取 JSON: { "DIPLOBLASTIC":"Characterizing the ovum when it has two primary
我有一个用例,需要将 JSON 反序列化为“远程”(在另一个 crate 中定义)结构的映射。我在这方面经历了一段可笑的困难时期,所以我一定错过了一些明显的东西。 以下本质上是所需的最终状态: use
我正在尝试从具有以下维度的 Rust 文件中读取 JSON: { "DIPLOBLASTIC":"Characterizing the ovum when it has two primary
在我的程序开始时,我从一个文件中读取数据: let file = std::fs::File::open("data/games.json").unwrap(); let data: Games =
#[serde(rename)] 似乎是正确的选择,但文档没有说明是否可行或如何操作。 这个 JSON 对象: { "name" : "myobject" "info" : {
我想将第 3 方库枚举与 JSON 相互转换。因为我不想编辑第 3 方源代码,所以我不想使用派生宏。 我想手写serde_json deserialize 方法。我认为模式匹配是可行的方法,但我需要匹
我被困在看似简单的问题上。我明白为什么我看到错误但似乎无法解决它。显然我遗漏了一些基本的东西。 fn terraform_deploy_info(app: &'a MyApp) -> std::res
我卡住了,下面是我收到的 JSON: { "BCH": { "aclass": "currency", "altname": "BCH", "decimals
我试图在 Rust 中 drain() 一个 vec 并将结果编码为 JSON 字符串。执行此操作的最佳惯用方法是什么? #![feature(custom_derive, plugin)] #![p
#[serde(rename)] 似乎是正确的选择,但文档没有说明是否可行或如何操作。 这个 JSON 对象: { "name" : "myobject" "info" : {
运行代码时: #![allow(unused)] use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std
我有一个包含类型 Option 的字段的结构体 我希望能够在该字段中存储任何对象(即由任何结构创建的对象)。我目前使用的方法是首先将对象转换为 JSON 字符串(使用 serde_json::to_s
extern crate serde_json; use serde_json::Value; use std::fs::File; use std::io::prelude::*; fn main(
我是一名优秀的程序员,十分优秀!