在Rust中推荐使用`use`声明的地方在哪里?

时间:2017-08-10 16:04:21

标签: rust

推荐use声明的推荐位置在哪里?在本书,常见问题解答,邮件列表或在线论坛中,我无法找到任何决定性的答案。我正在Rust开始一个新项目,我更愿意立刻采取正确的方法。

建议采用以下两种方法之一吗?它只适用于#34;别名"什么东西或它做得更多,比如如果之前没有使用过模块那么初始化它?

use std::io;
use std::io::Write;

fn some_func() -> () {
    [...] // We assume we need std::io here
}

fn some_other_func() -> () {
    [...] // We assume we need std::io and std::io::Write here
}

OR

fn some_func() -> () {
    use std::io;
    [...] // We assume we need std::io here
}

fn some_other_func() -> () {
    use std::io;
    use std::io::Write;
    [...] // We assume we need std::io and std::io::Write here
}

1 个答案:

答案 0 :(得分:5)

TL; DR:像几乎所有其他软件一样,这取决于你在做什么。我观察到的(并且更喜欢自己)的常见风格是将它们放在文件的顶部,并根据需要将它们移动到更窄的范围。

通常,我建议首先在useextern crate语句之后直接放置mod语句,用空行分隔:

extern crate foo;
extern crate bar;

mod interesting;

use std::collections::HashMap;
use foo::Foo;
use bar::{Quux, moo};    
use interesting::something;    

// structs, functions, etc.

我的默认基于以下事实 - 大多数情况下 - 导入用于多个顶级项目。因此,仅导入一次是有意义的。

有时会imported traits have conflicting methods,在这种情况下,我会将导入范围限定在需要的位置。在某些情况下,我会严重处理单个枚举,并希望对其进行全局导入以避免重新声明枚举的名称:

fn foo(e: MyEnum) {
    use MyEnum::*;

    match e {
        One => 1,
        Two => 2,
    }
}

在某些情况下,冲突的use语句表明您在单个文件中尝试过多,并且应将其拆分为单独的文件,然后use语句不再含糊不清。