Как сделать мои структурные поля изменяемыми при доступе через общий ящик 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);

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

Другие вопросы по тегам