Rust 我怎样才能写信给编剧并获得所写的内容?

Rust 我怎样才能写信给编剧并获得所写的内容?,rust,Rust,有没有办法使用编写器将内容写回该编写器?类似于BufWriterReader?我尝试过这个,但没有编译: #[test] fn write_to_json_test0() { let json = get_schema_without_optionals0(); // this is a thing serde_json can (de)serialize let buf = Vec::new(); let writer = BufWriter::new(buf); //

有没有办法使用
编写器
将内容写回该编写器?类似于
BufWriterReader
?我尝试过这个,但没有编译:

#[test]
fn write_to_json_test0() {
    let json = get_schema_without_optionals0(); // this is a thing serde_json can (de)serialize
    let buf = Vec::new();
    let writer = BufWriter::new(buf); // buf moves here

    serde_json::to_writer(writer, &json).unwrap(); // writer moves here

    let s = String::from_utf8(writer.into_inner().unwrap()).unwrap(); // compile error, because writer used after move

    assert_eq!(s, json.to_string());
}
有,但现在没有

如果
to_string()
to_writer()
返回相同的值,最快的测试方法是什么?我真的需要写入文件并将文件读取为字符串吗?

有一个:

有一个:

测试
to_string()
to_writer()
是否返回相同值的最快方法

看看:

这要求:

结合在一起,它几乎与您的代码相同:

let mut writer = Vec::with_capacity(128);
to_writer(&mut writer, value)?;
let string = unsafe {
    // We do not emit invalid UTF-8.
    String::from_utf8_unchecked(writer)
};
Ok(string)
但是,它的效率更高:

  • 它在
    Vec
  • 它避免了
    BufWriter
    (as)
  • 它跳过UTF-8有效性检查
BufWriter::buffer()的拉取请求

不,在合并并释放拉取请求之前,您无法访问
BufWriter
的缓冲区-这是添加该请求的部分原因

写信给这位作家

您似乎没有完全理解
BufWriter
的用途。它缓冲您写入其中的数据,以便底层写入程序无法获取它。缓冲区中的数据是底层写入程序未看到的数据。您引用的拉取请求对您没有帮助

事实上,在尝试将基础
Vec
解析为字符串之前,需要确保
flush
缓冲区中没有数据。谢天谢地,
into_inner
已经为您做到了这一点

作家搬来了

这是因为Serde遵循“C-RW-VALUE”准则:。您可以使用以下方法避免放弃编写器的所有权:

by_ref
只是一个方便的函数,可以避免显式获取可变引用的相对奇怪的语法。对于
Read
Iterator
重复这种模式

另见:

测试
to_string()
to_writer()
是否返回相同值的最快方法

看看:

这要求:

结合在一起,它几乎与您的代码相同:

let mut writer = Vec::with_capacity(128);
to_writer(&mut writer, value)?;
let string = unsafe {
    // We do not emit invalid UTF-8.
    String::from_utf8_unchecked(writer)
};
Ok(string)
但是,它的效率更高:

  • 它在
    Vec
  • 它避免了
    BufWriter
    (as)
  • 它跳过UTF-8有效性检查
BufWriter::buffer()的拉取请求

不,在合并并释放拉取请求之前,您无法访问
BufWriter
的缓冲区-这是添加该请求的部分原因

写信给这位作家

您似乎没有完全理解
BufWriter
的用途。它缓冲您写入其中的数据,以便底层写入程序无法获取它。缓冲区中的数据是底层写入程序未看到的数据。您引用的拉取请求对您没有帮助

事实上,在尝试将基础
Vec
解析为字符串之前,需要确保
flush
缓冲区中没有数据。谢天谢地,
into_inner
已经为您做到了这一点

作家搬来了

这是因为Serde遵循“C-RW-VALUE”准则:。您可以使用以下方法避免放弃编写器的所有权:

by_ref
只是一个方便的函数,可以避免显式获取可变引用的相对奇怪的语法。对于
Read
Iterator
重复这种模式

另见:


您是否尝试过将
&mut writer
传递给
to_writer
函数?您是否尝试过将
&mut writer
传递给
to_writer
函数?我知道缓冲内存没有多大意义,但API需要一个writer。@Markus和
BufWriter
。您可以传递给
BufWriter::new()
的所有内容都是一个编写器。@Markus。@Shepmaster是的,但to_编写器不接受Vec,我以前试过。@Markus它应该接受它。根据上下文的不同,您可能需要使类型显式(
let mut buf:Vec=…
)。我知道缓冲内存没有多大意义,但API需要一个编写器。@Markus和
BufWriter
。您可以传递给
BufWriter::new()
的所有内容都是一个编写器。@Markus。@Shepmaster是的,但to_编写器不接受Vec,我以前试过。@Markus它应该接受它。根据上下文的不同,您可能需要将类型显式化(
let mut buf:Vec=…
)。答案应该简单明了,因为有一个
by_ref()
;-)更准确地说,BufWriter的缓冲区不是我的Vec,这就是pull请求在这里没有帮助的原因。你喜欢在这里回答问题吗?我不确定,但你听起来有点自上而下。我很确定你对锈病了如指掌,没有必要告诉任何人你认为他/她不知道什么…@Markus,请退后一步。Shepmaster花费大量时间免费帮助StackOverflow上的其他人。很难读懂一个不知名的人在互联网上写的东西的语调,但如果有疑问,请假设你是真诚的,特别是当有人试图帮助你时。@Markus一些程序员很想理解解决方案背后的原因,有些程序员关心的是,有一种通用模式适用于多种情况,有些程序员关心的是,他们的推理哪里出错了。并非每个项目都是如此
let vec = try!(to_vec(value));
let string = unsafe {
    // We do not emit invalid UTF-8.
    String::from_utf8_unchecked(vec)
};
Ok(string)
let mut writer = Vec::with_capacity(128);
try!(to_writer(&mut writer, value));
Ok(writer)
let mut writer = Vec::with_capacity(128);
to_writer(&mut writer, value)?;
let string = unsafe {
    // We do not emit invalid UTF-8.
    String::from_utf8_unchecked(writer)
};
Ok(string)
#[test]
fn write_to_json_test0() -> Result<(), io::Error> {
    let json = Value::Number(42.into());

    let buf = Vec::new();
    let mut writer = BufWriter::new(buf);
    serde_json::to_writer(writer.by_ref(), &json)?;
    let s = String::from_utf8(writer.into_inner()?).unwrap();

    assert_eq!(s, json.to_string());
    Ok(())
}
impl<'a, W: Write + ?Sized> Write for &'a mut W