Как сделать мои структурные поля изменяемыми при доступе через общий ящик ptr?
Примечание редактора: этот код относится к версии Rust до 1.0 и не является синтаксически или семантически верным кодом Rust 1.0.
Таким образом, определение общих указателей ящиков в качестве учебного упражнения. Чисто академическое упражнение.
#[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. Это какое-то ограничение на доступ к управляемым указателям?
1 ответ
Ты не можешь
@
неизменен.- Управляемые ящики постоянно уничтожаются, поэтому не стоит их использовать.
@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);
Это не красиво; умные черты указателя могут хорошо улучшить ситуацию. Но там, где это возможно, избегайте таких вещей. Неизменные данные - это хорошо, локальные данные - это хорошо.