我有 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!");
}
Run Code Online (Sandbox Code Playgroud)
如果第一个use
被删除,io
则不再指定。我们可以通过添加std::
before来解决这个问题io
。
该程序现在如下所示:
use std::io::Write;
fn main() {
print!("Hello World!");
// Let's flush the Buffer
std::io::stdout().flush().expect("Oh No!");
}
Run Code Online (Sandbox Code Playgroud)
引起我兴趣的是第二个use
- 需要flush
在标准输出上使用该方法。这让我的 Java 类比非常不愉快——我期望flush
成为“stdout
事物”的一部分,如果我拥有该事物,我就可以使用这些方法——但这里的情况显然不是这样。
是否可以在没有第二个的情况下编写上面的程序use
?如果是这样,完整指定的语法是什么flush
?
到底是怎么回事?
通过下面的一些有用的评论解决了。链接的问题虽然不是同一个问题,但确实有相似的答案。
有问题的行:
std::io::stdout().flush().expect("Oh no!");
根据我的经验,stdout.flush()
这意味着这flush
是标准输出中的一个函数。在 Java 中,stdout 是一个对象,以 .flush 形式传递给“幕后”flush 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!"
);
Run Code Online (Sandbox Code Playgroud)
这很有启发性。谢谢大家,我希望这对将来的人有所帮助。
归档时间: |
|
查看次数: |
322 次 |
最近记录: |