2015-05-01 3 views
4

Извините за вопрос о новичке. Ошибка здесьБорты и собственность на объект

<anon>:30:5: 30:17 error: cannot borrow immutable borrowed content as mutable 
<anon>:30  routing_node.put(3); 
       ^^^^^^^^^^^^ 

Я пробовал много вещей, чтобы обойти это, но знаю наверняка, это простая ошибка. Любая помощь очень ценится.

use std::thread; 
use std::thread::spawn; 
use std::sync::Arc; 

struct RoutingNode { 
    data: u16 
} 

impl RoutingNode { 
    pub fn new() -> RoutingNode { 
     RoutingNode { data: 0 } 
} 

pub fn run(&self) { 
    println!("data : {}", self.data); 
} 

pub fn put(&mut self, increase: u16) { 
    self.data += increase; 
} 
} 

fn main() { 
    let mut routing_node = Arc::new(RoutingNode::new()); 
    let mut my_node = routing_node.clone(); 
{ 
    spawn(move || {my_node.run(); }); 
} 

routing_node.put(3); 
} 

ответ

5

Arc не позволяет мутировать из его внутреннее состояние, даже если контейнер отмечен как изменяемые. Вы должны использовать один из Cell, RefCell или Mutex. Оба Cell и RefCell не являются потоковыми, поэтому вы должны использовать Mutex (last paragraph in docs).

Пример:

use std::thread::spawn; 
use std::sync::Mutex; 
use std::sync::Arc; 

struct RoutingNode { 
    data: u16, 
} 

impl RoutingNode { 
    pub fn new() -> Self { RoutingNode { data: 0, } } 
    pub fn run(&self) { println!("data : {}" , self.data); } 
    pub fn put(&mut self, increase: u16) { self.data += increase; } 
} 

fn main() { 
    let routing_node = Arc::new(Mutex::new(RoutingNode::new())); 
    let my_node = routing_node.clone(); 
    let thread = spawn(move || { my_node.lock().unwrap().run(); }); 

    routing_node.lock().unwrap().put(3); 
    let _ = thread.join(); 
} 

Playpen