我有 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 次 |
| 最近记录: |