我正在学习来自Java背景的Rust。在Java中,我通常会import java.util.ArrayList;
。据我了解,这样做很方便,可以避免每次出现java.util.
时都将ArrayList
放在前面。
考虑以下Rust:
use std::io;
use std::io::Write;
fn main() {
print!("Hello World!");
// Let's flush the Buffer
io::stdout().flush().expect("Oh No!");
}
如果删除了第一个use
,则不再指定io
。我们可以通过在std::
之前添加io
来解决此问题。
该程序现在显示如下:
use std::io::Write;
fn main() {
print!("Hello World!");
// Let's flush the Buffer
std::io::stdout().flush().expect("Oh No!");
}
引起我兴趣的是第二个use
-必须在stdout上使用flush
方法。这使我的Java类比非常不满意-我希望flush
成为“ stdout
事物”的一部分,如果有,我可以使用这些方法-但这显然不是这种情况
是否可以在没有第二个use
的情况下编写上述程序?如果是这样,完全指定flush
的语法是什么?
这是怎么回事?
已解决。链接的问题虽然不是相同的问题,但确实具有相似的答案。
相关行:
std::io::stdout().flush().expect("Oh no!");
根据我的经验,stdout.flush()
暗示flush
是stdout中的一个函数。在Java中,stdout将是一个对象,以this
的形式传递到刷新“幕后”。在Python中,它将在方法签名中显式表示为self
。
在Rust中,在这种情况下,stdout
通过点表示法传递给flush
。要完全指定flush
,必须在stdout
括号内以“传统”方式传递flush
。
简而言之,Object.method()
等效于method(Object)
。 (至少在这里-我还在学习,并且可能是非常错误的。)
要完全指定stdout
和flush
,请使用以下内容:
std::io::Write::flush(&mut std::io::stdout()).expect("Oh no!");
进一步看,expect
的第一个参数是“自我”,进一步推动了x.y() == y(x)
的想法。将以上内容完全转换为y(x)格式,我们得出非常复杂的内容:
std::result::Result::expect(
std::io::Write::flush(
&mut std::io::stdout()
),
"Oh no!"
);
这很有启发性。谢谢大家,我希望这对以后的人有所帮助。