2015-05-31 4 views
8

के रूप में 'एफएन` बंद होने पर कब्जा बाहरी चर उधार नहीं ले सकता है यह जंग के साथ मेरा पहला दिन है, लेकिन मैं कुछ तुच्छ करने की कोशिश कर रहा हूं, और मैं अटक गया हूं।उत्परिवर्तनीय

मैं जो करने की कोशिश कर रहा हूं वह है वेक्टर में एक स्ट्रक्चर जोड़ने और परिणाम वापस करने के लिए। मैं जो कोशिश कर रहा हूं वह एक बहुत ही सरल आरईएसटी सेवा बनाना है जो पोस्ट करते समय स्मृति में डेटा संग्रहीत करेगा, और जीईटी प्रारूप में जेएसओएन प्रारूप में सभी डेटा वापस कर देगा।

यह मेरे वर्तमान कोड है:

fn main() { 
    let mut server = Nickel::new(); 
    let mut reservations = Vec::new(); 

    server.post("/reservations/", middleware! { |request, response| 
     let reservation = request.json_as::<Reservation>().unwrap(); 

     reservations.push(reservation); // <-- error occurs here 

     format!("Hello {} {}", reservation.name, reservation.email) 

    }); 

    server.listen("127.0.0.1:3000"); 
} 

मैं एक RefCell साथ this solution की कोशिश की, लेकिन फिर मैं त्रुटि है कि विशेषता सिंक के लिए Vec<reservation::Reservation>

उत्तर

13

लागू नहीं किया गया मिलता है इस का एक बहुत अच्छा उदाहरण है कैसे जंग आपको धागे से असुरक्षित से बचाता है।

यदि आप इसके बारे में सोचते हैं, तो आपके वर्तमान कोड में यह संभव होगा कि एकाधिक थ्रेड किसी भी तरह के सिंक्रनाइज़ेशन के बिना reservations को समवर्ती रूप से परिवर्तित करने का प्रयास करें। यह एक डेटा रेस है और जंग इसके बारे में शिकायत करेगा।

सिंक्रनाइज़ेशन प्राप्त करने के लिए reservations वेक्टर को Mutex में लपेटना एक संभावित समाधान होगा। आपको Arc (परमाणु संदर्भ गिनती) की भी आवश्यकता होगी, क्योंकि जंग यह साबित नहीं कर सकता कि reservations धागे से अधिक समय तक जीवित रहेगा।

इन परिवर्तनों के साथ

, अपने कोड निम्नलिखित की तरह होना चाहिए:

use std::sync::{Arc, Mutex}; 
fn main() { 
    let mut server = Nickel::new(); 
    let reservations = Arc::new(Mutex::new(Vec::new())); 

    server.post("/reservations/", middleware! { |request, response| 
     let reservation = request.json_as::<Reservation>().unwrap(); 

     reservations.lock().unwrap().push(reservation); // <-- error occurs here 

     format!("Hello {} {}", reservation.name, reservation.email) 

    }); 

    server.listen("127.0.0.1:3000"); 
} 

आप अतिरिक्त जानकारी के बारे में Mutex और Arc के लिए दस्तावेज़ देख सकते हैं।

संबंधित मुद्दे