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
- 它避免了
(as)BufWriter
- 它跳过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