2017-07-18 48 views
2

我想申報鏽String不變,但我得到一個編譯器錯誤我不能做的試圖聲明中預期類型的​​字符串常量結果,發現「我的字符串」

const DATABASE : String::from("/var/lib/tracker/tracker.json"); 

和這裏就是我得到的,當我嘗試編譯:

error: expected type, found `"/var/lib/tracker/tracker.json"` 
    --> src/main.rs:19:31 
    | 
19 | const DATABASE : String::from("/var/lib/tracker/tracker.json"); 
    |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

error: expected one of `!`, `+`, `->`, `::`, or `=`, found `)` 
    --> src/main.rs:19:64 
    | 
19 | const DATABASE : String::from("/var/lib/tracker/tracker.json"); 
    |                ^expected one of `!`, `+`, `->`, `::`, or `=` here 
+0

你試過'const DATABASE = String ::'而不是'const DATABASE:'?這意味着你正在註釋這種類型,你不知道。 – perfect5th

+0

我確實嘗試過。這裏是編譯器輸出: '錯誤:預期':',找到'=''爲: 'const DATABASE = String :: from(「f」)' – arsalan86

+1

啊......你必須註釋一個類型const,你不能使用'String',因爲它需要一個靜態大小,所以你必須使用'&str'。試試這個:'const DATABASE:&str =「/var/lib/tracker/tracker.json」;'See Shepmaster's answer。 – perfect5th

回答

7

你應該閱讀The Rust Programming Language, second edition,特別是chapter that discusses constants。對於聲明const正確的語法是:

const NAME: Type = value; 

在這種情況下:

const DATABASE: String = String::from("/var/lib/tracker/tracker.json"); 

然而,這不會起作用,因爲分配的字符串是不是可以在編譯計算時間。這就是const的含義。您可能需要使用string slice,特別是一個有靜態一生,這是const S和static內隱:即只需要讀取一個字符串應該接受&str

const DATABASE: &str = "/var/lib/tracker/tracker.json"; 

功能,所以這是不可能導致任何問題。它還具有無需任何分配的好處,所以它非常高效。

如果您需要需要 a String,您可能需要對其進行變異。在這種情況下,使其全球化將導致線程問題。相反,您應該在需要時分配String::from(DATABASE)並通過String

+0

謝謝!這工作,並且解釋也真的有用! 我正在讀這本書,現在我意識到我做錯了什麼。 – arsalan86

+0

注意:*不是可以在編譯時計算出來的東西* =>這比實現語言限制更受實現限制。預先計算字符串是完全合理的(並且對Drop完成任何操作),畢竟'&str'(指針+長度)和'String'(指針+長度+容量)之間沒有太大的區別。 –