2017-08-10 27 views
6

哪裏是推薦放置use聲明的地方?我在本書,常見問題解答,郵件列表或在線論壇中找不到任何決定性答案。我正在Rust開始一個新項目,我希望馬上得到正確的方法。在Rust中推薦`使用`聲明的地方在哪裏?

建議下面兩種方法之一嗎?它只是用於「別名」的東西,還是做得更多,比如初始化一個模塊,如果它之前沒有被使用過的話?

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 
} 
+3

有一個'fmt-rfcs'回購討論風格相關的問題。在[本期](https://github.com/rust-lang-nursery/fmt-rfcs/issues/24)中,他們正在討論「使用」進口 - 目前尚未有明確的同意。他們也沒有談論很多關於模塊級導入和功能級導入的內容。根據我的經驗,幾乎所有東西都是在模塊級別導入的,特別是那些用於多種功能的東西。就個人而言,我認爲我只使用功能級別的導入,當我有一個非常特殊的導入或我想要範圍的glob-import。但我想應該在相關問題中建立一條規則。 –

+0

感謝您指出問題討論,這非常有趣! – achedeuzot

回答

4

TL; DR:像幾乎所有其他的軟件,這取決於你在做什麼。我觀察到的(並且更喜歡自己)的通用風格是將它們放在文件的頂部,並根據需要將它們移動到更窄的範圍。


一般情況下,我建議任何extern cratemod語句後放置use語句直接啓動,由一個空行分隔:

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語句不再含糊不清。

+1

+1爲枚舉案例;我用它來保存'匹配'(和行長度)的輸入,但它確實會污染頂級模塊在那裏使用它們。 –