2014-02-21 1 views
1

Итак, выбирая общие указатели для ящиков как учебное упражнение. Чисто академические упражнения.Как мне изменить поля структуры при доступе через общий пакет ptr?

#[feature(managed_boxes)]; 

struct Monster { 
    legs: int 
} 

fn main() { 
    let mut steve = @Monster{ legs: 2 }; 

    steve.legs = 8; 
} 

Я немного удивлен, получаю эту ошибку компилятора:

shared_box.rs:10:5: 10:15 error: cannot assign to immutable field 
shared_box.rs:10  steve.legs = 8; 

Что дает?

Ошибка исчезнет, ​​если я переключусь на указатель Owned Box. Это какое-то ограничение на доступ к управляемому указателю?

ответ

3

Вы не можете.

  • @ является неизменным.
  • Управляемые коробки постоянно уничтожаются, поэтому вы не должны их использовать.
  • @mut был удален с данного языка.

Существует, однако, способ обойти это: RefCell. Если вы завернете объект в него, вы можете изменить его, хотя он кажется неизменным. Иногда это полезно, но по возможности вам следует избегать этого. Вот пример его использования (с Gc, вы, вероятно, следует, как правило, использовать Rc в настоящее время вместо этого, потому что Gc не правильно реализован):

let steve = box(GC) RefCell::new(Monster { legs: 2 }); 
steve.borrow().borrow_mut().get().legs = 8; 
assert_eq!(steve.borrow().borrow().get().legs, 8); 

Это не очень; умные указатели могут улучшить ситуацию. Но там, где это возможно, избегайте таких вещей. Неизменяемые данные хороши, локальные данные задачи хороши.

+0

Хорошо, что это подтвердилось, спасибо! –

+2

@GregMalcolm Чтобы быть ясным, * содержимое * '@' является неизменным слотом, то есть 'x' в' y = @ x' не может быть изменено, даже если 'y' является' mut'. Такие типы, как 'RefCell' и' Cell', предлагают «внутреннюю изменчивость» ('RefCell' поставляется с проверками времени выполнения, чтобы гарантировать, что никакие инварианты указателей' & mut' не будут нарушены: если указатель '& mut' существует для части данных, тогда это единственный путь, по которому эти данные могут быть затронуты. Поддержание этого инварианта - это * почему * содержимое разделяемых типов по умолчанию неизменно.) – huon