如何在没有“use”关键字的情况下使用 Rust 中的方法?

Nav*_*ron 5 syntax rust

我有 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)。(至少在这里 - 我仍在学习,并且可能是非常错误的。)

为了完全指定stdoutflush,我使用以下命令:

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)

这很有启发性。谢谢大家,我希望这对将来的人有所帮助。