Syntax 如何使用一种方法来除锈而不必;使用「;关键词?

Syntax 如何使用一种方法来除锈而不必;使用「;关键词?,syntax,rust,Syntax,Rust,我从Java背景中学习Rust。在Java中,我通常导入Java.util.ArrayList。据我所知,这是一种方便,可以防止每次出现ArrayList之前都需要将java.util.放在前面 考虑以下因素: use std::io; use std::io::Write; fn main() { print!("Hello World!"); // Let's flush the Buffer io::stdout().flush().expect("Oh No!"

我从Java背景中学习Rust。在Java中,我通常
导入Java.util.ArrayList。据我所知,这是一种方便,可以防止每次出现
ArrayList
之前都需要将
java.util.
放在前面

考虑以下因素:

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
。我们可以通过在
io
之前添加
std::
来解决这个问题

该程序现在的内容如下:

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
的一部分”,如果我有东西,我可以使用这些方法-但这里显然不是这样

是否可以在不使用第二个
的情况下编写上述程序?如果是,那么完全指定
flush
的语法是什么

发生了什么事


解决方案 通过下面一些有用的评论解决了问题。这些相互关联的问题虽然不是同一个问题,但确实有相似的答案

所涉行:

std::io::stdout().flush().expect(“噢,不!”);

根据我的经验,
stdout.flush()
意味着
flush
是stdout中的一个函数。在Java中,stdout将是一个对象,作为
this
传递给flush“幕后”。在Python中,它将显式地作为
self
出现在方法签名中

在Rust中,在这种情况下,
stdout
通过点符号传递给
flush
。要完全指定
flush
,必须在
flush
的括号内以“传统”方式传递
stdout

简而言之,
Object.method()
相当于
method(Object)
。(至少在这里——我还在学习,可能是大错特错。)

要完全指定
stdout
flush
,我使用以下命令:

std::io::Write::flush(&mut std::io::stdout())。期望(“噢,不!”)

进一步看,
expect
的第一个参数是“self”,进一步推进了
x.y()==y(x)
的思想。将上述内容完全转换为y(x)格式,我们得出了非常复杂的结论:

std::result::Result::expect(
    std::io::Write::flush(
        &mut std::io::stdout()
    ),
    "Oh no!"
);

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

在您的情况下,副本建议
std::io::Write::flush(&mut std::io::stdout())
。完全限定语法(您在其中同时指定trait和type)看起来类似于
::flush(&mut std::io::stdout)
。您可能会发现它很有趣。@trentcl,这正是我想要的。非常感谢。