2015-04-15 445 views
3

我想賦值給一個全局變量,但它一直有一個編譯器錯誤:如何將字符串分配給可變靜態變量?

static mut NameArr: [&'static str; 20] = ["\0"; 20]; 

fn main() { 

    unsafe { 
    static mut S1 :String = "".to_string(); 

    S1.push('\0'); 

    NameArr[0] = S1.as_slice(); 
    } 
} 

錯誤:

a.rs:7:29: 7:43 error: mutable statics are not allowed to have destructors 
a.rs:7  static mut S1 :String = "".to_string(); 
            ^~~~~~~~~~~~~~ 
a.rs:7:29: 7:43 error: static contains unimplemented expression type [E0019] 
a.rs:7  static mut S1 :String = "".to_string(); 
            ^~~~~~~~~~~~~~ 
error: aborting due to 2 previous errors 
+2

爲什麼你想有一個全局可變變量?這強烈推動*一切*魯斯特想鼓勵。基本上你的整個程序必須使用'unsafe'這一事實表明你確實想要做一些尷尬的事情。 – Shepmaster

+3

你實際上試圖做什麼(與之不同)?從你的代碼示例來看,我一點也不清楚。 –

+0

爲什麼在應用程序生命週期中有全局的'&'static str'?如果永遠不會得到解除分配,並可能導致內存泄漏IIUC。 –

回答

6

不知道你正在嘗試做的,所以我不能告訴你如何去做。

也許你想How do I create a global, mutable singleton?

話雖這麼說,我可以幫助解釋你的錯誤:

static mut NameArr: [&'static str; 20] = ["\0"; 20]; 

聲明一個可變的全局變量。該變量是一個固定長度的20個項目的數組。每個項目是&'static str,字符串文字必須保證在整個程序的生命中生活。這就是'static的意思。

static mut S1: String = "".to_string(); 

這試圖創建另一個可變全局變量,此時它是一個String,即分配並擁有在堆中一塊內存的對象。當String超出範圍時,將通過析構函數釋放內存。這是你的第一個錯誤的來源 - 全局變量不允許有析構函數。此外,當您定義全局值時,您目前不允許使用調用方法 - 這些方法現在無法運行!

擁有全局可變變量對於Rust或任何程序來說真的不是一個好主意。有技術原因(如數據競賽)和程序員的原因(合理化這種代碼是)。如果您真的需要,可以查看How do I create a global, mutable singleton?以瞭解如何操作。

Rust因爲這些原因迫使你使用unsafe塊來處理可變全局變量。編譯器不能再保證程序的安全。例如,如果您打電話給S1.clear,那麼存儲在數組中的值會發生什麼變化?

也有文體擔憂:

  1. 鏽使用snake_case變量
  2. SCREAMING_SNAKE_CASE常量/靜
  3. CamelCase對於結構/枚舉/性狀
  4. 4空間縮進
  5. 變定義應爲name: type,其後的空格爲:
0

在Rust中,您將使用lazy_staticRwLockMutex來同步寫入訪問。

Cargo.toml

[dependencies] 
lazy_static = "0.2" 

main.rs

#[macro_use] 
extern crate lazy_static; 

use std::sync::RwLock; 

lazy_static! { 
    static ref GLOBAL_STRING: RwLock<String> = RwLock::new("string".to_string()); 
} 

fn main() { 
    { 
     let nice = GLOBAL_STRING.read().unwrap(); 
     println!("{}", *nice); 
    } 

    { 
     let mut mystr = GLOBAL_STRING.write().unwrap(); 
     *mystr = "assign new".to_string(); 
    } 

    { 
     let nice = GLOBAL_STRING.read().unwrap(); 
     println!("{}", *nice); 
    } 
} 
相關問題