Rust 呼叫写信!输出字符串是否被Ok()包裹在铁锈中
当尝试读取一个文件并将其写入另一个文件时,在使用write!时,每一行都被包装在Ok()中!。我一直无法发现我做错了什么,希望有人会有想法 我已经能够将这个问题与{:#?}有关的东西隔离开来 如果我将regulat文本放在“”中,它会很好地打印,并且超出Ok()。还有其他人见过这个吗 谢谢Rust 呼叫写信!输出字符串是否被Ok()包裹在铁锈中,rust,output,Rust,Output,当尝试读取一个文件并将其写入另一个文件时,在使用write!时,每一行都被包装在Ok()中!。我一直无法发现我做错了什么,希望有人会有想法 我已经能够将这个问题与{:#?}有关的东西隔离开来 如果我将regulat文本放在“”中,它会很好地打印,并且超出Ok()。还有其他人见过这个吗 谢谢 使用std::fs::File; 使用std::io::{BufReader,BufRead}; 使用std::io::{Write,Error}; fn main()->结果{ 让ofile=File::o
使用std::fs::File;
使用std::io::{BufReader,BufRead};
使用std::io::{Write,Error};
fn main()->结果{
让ofile=File::open(“test.xml”)?;
让mut new_file=file::create(“output.xml”)?;
让输入=BufReader::new(ofile);
对于input.lines()中的行{
写入!(新的_文件,“{:#?}”,行)?;
}
好(())
}
输入
AV
测试员
测试描述
合成输出
Ok(
"<?xml version = \'1.0\' encoding = \'UTF-8\'?>"
)Ok(
"<Configuration xmlns=\"configuration\" configType=\"TEST_RULE\" actionType=\"NEW RULE\">"
)Ok(
" <Reference>"
)Ok(
" <Code>AV</Code>"
)Ok(
" <Name>TESTER</Name>"
)Ok(
" </Reference>"
)Ok(
" <ConfigItems>"
)Ok(
" <ConfigItem>"
)Ok(
" <description>Test Description</description>"
)Ok(
" </ConfigItem>"
)Ok(
" </ConfigItems>"
)Ok(
"</Configuration>"
)
修正:
根据下面的回复,我更改了文字!并修复了该问题
写!(新的_文件,“{}\n”,行?)?;
在BufReader
上调用.lines()
将为您提供一个,其关联的项
-类型为std::io::Result
。也就是说,在对.lines()
进行迭代时,迭代器会生成Ok(String)
(如果读取成功)或Err(io::Error)
(如果读取下一行时发生io错误)。这就是为什么要打印Ok(…)
常见的情况如下:
for line in input.lines() {
// If `line` is `Ok(String)`, re-assign `line`; return the error otherwise.
let line = line?;
// Possible read-errors have been dealt with, `line` is a `String`.
write!(new_file, "{:#?}", line)?;
}
如果您对某个类型感到困惑,通常的做法是将某个变量指定为您期望的或某个“荒谬”类型,只是为了让编译器对您大喊大叫
for line in input.lines() {
let line: String = line; // line should be a String, right?
let line: () = line; // I have no idea what line is, but it's not () for sure
write!(new_file, "{:#?}", line)?;
}
都让线:…=行
将导致编译器引发错误,因为行是结果,无法分配给固定为其他类型的变量;现在您知道行
实际上是结果
,而不是字符串
。在BufReader
上调用.lines()
会给您一个,其关联的项
-类型是std::io::Result
。也就是说,在对.lines()
进行迭代时,迭代器会生成Ok(String)
(如果读取成功)或Err(io::Error)
(如果读取下一行时发生io错误)。这就是为什么要打印Ok(…)
常见的情况如下:
for line in input.lines() {
// If `line` is `Ok(String)`, re-assign `line`; return the error otherwise.
let line = line?;
// Possible read-errors have been dealt with, `line` is a `String`.
write!(new_file, "{:#?}", line)?;
}
如果您对某个类型感到困惑,通常的做法是将某个变量指定为您期望的或某个“荒谬”类型,只是为了让编译器对您大喊大叫
for line in input.lines() {
let line: String = line; // line should be a String, right?
let line: () = line; // I have no idea what line is, but it's not () for sure
write!(new_file, "{:#?}", line)?;
}
都
让线:…=行
将导致编译器引发错误,因为行是结果,无法分配给固定为其他类型的变量;现在您知道行
实际上是结果
而不是字符串
。如果我没有弄错的话,“{:#?}”
用于调试输出。因此,如果将行
包装在Ok(…)
中,它将像在您的帖子中一样打印出来。你应该打开行以获得实际的字符串。是什么让你认为你需要为此编写write
宏?Peter Varo-我正在扩展rust cookbook ForceBru-Aha上的一个示例…这似乎解决了这个问题。找不到任何关于仅将其用作调试功能的信息…很高兴知道。如果我没弄错的话,谢谢,“{:#?}”
用于调试输出。因此,如果将行
包装在Ok(…)
中,它将像在您的帖子中一样打印出来。你应该打开行以获得实际的字符串。是什么让你认为你需要为此编写write
宏?Peter Varo-我正在扩展rust cookbook ForceBru-Aha上的一个示例…这似乎解决了这个问题。找不到任何关于仅将其用作调试功能的信息…很高兴知道。非常感谢。