前言:我已經完成了我的研究,並且知道它確實不是一個好主意/也不是慣用的Rust有一個。完全開放給解決這個問題的其他方法的建議。如何創建一個全局可變布爾狀態標誌
背景:我有一個連接到websocket的控制檯應用程序,一旦連接成功,服務器發送一個「連接」消息。我有發件人,接收者是獨立的線程,一切都很好。 connect()
調用一個循環開始並在終端中發出提示,表示應用程序已準備好接收來自用戶的輸入。
問題:問題是,當前的執行調用流程連接,然後立即顯示提示,然後應用程序收到來自服務器的消息,指出它已連接。
如何我會在高級語言解決這個問題:將全球布爾(我們就叫它ready
),一旦應用程序是「準備」,然後顯示提示。
我怎麼覺得這可能看起來拉斯特:
//Possible global ready flag with 3 states (true, false, None)
let ready: Option<&mut bool> = None;
fn main(){
welcome_message(); //Displays a "Connecting..." message to the user
//These are special callback I created and basically when the
//message is received the `connected` is called.
//If there was an error getting the message (service is down)
//then `not_connected` is called. *This is working code*
let p = mylib::Promise::new(connected, not_connected);
//Call connect and start websocket send and receive threads
mylib::connect(p);
//Loop for user input
loop {
match ready {
Some(x) => {
if x == true { //If ready is true, display the prompt
match prompt_input() {
true => {},
false => break,
}
} else {
return; //If ready is false, quit the program
}
},
None => {} //Ready is None, so continue waiting
}
}
}
fn connected() -> &mut bool{
println!("Connected to Service! Please enter a command. (hint: help)\n\n");
true
}
fn not_connected() -> &mut bool{
println!("Connection to Service failed :(");
false
}
問: 你將如何解決這個問題的鏽?我曾嘗試將它傳遞給所有庫方法調用,但遇到了有關在FnOnce()閉包中借用不可變對象的一些主要問題。
雖然我會鼓勵你*不*使用全局可變狀態,我想如果我沒有至少指向[這個答案]是失職(http://stackoverflow.com/questions/27791532/how-do-i-create-a-global-mutable-singleton),告訴你如何做到這一點。 – Shepmaster 2015-02-09 02:45:05