2017-07-18 35 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'(指针+长度+容量)之间没有太大的区别。 –

相关问题