如何在Rust中使用不带“ use”关键字的方法?

时间:2019-01-08 03:05:30

标签: 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!");
}

如果删除了第一个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)。 (至少在这里-我还在学习,并且可能是非常错误的。)

要完全指定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!"
);

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

0 个答案:

没有答案