Найти в Дзене
10 подписчиков

В ответ на пост

Сейчас выяснил, что RwLock<RefCell<Option<...>>> это бред полный. Я почему-то думал, что нельзя просто так изменять значения в структурах (не знаю, почему) и нужен этот RefCell, который позволяет заменить значение.

А он на самом деле нужен для того, чтобы когда у тебя есть ссылка для только чтения, то ты мог в это поле всё равно что-то записать:

struct Example {
field_a: i32,
field_b: std::cell::RefCell<i32>,
}

#[test]
fn example_test() {
// Modifications of `field_b` will work even without "mut" there
let mut example = Example {
field_a: 42,
field_b: std::cell::RefCell::new(13),
};

let example_ref = &example;
example_ref.field_b.replace(2);

let example_mut_ref = &mut example;
example_mut_ref.field_a = 1;

assert_eq!(example.field_a, 1);
assert_eq!(example.field_b.borrow().clone(), 2);
}

Плюс RefCell не поддерживает многопоточность. А RwLock и так даёт брать &mut ссылки на его содержимое, плюс Option оказывается имеет методы для его мутации: .take() чтобы забрать значение и оставить None, .insert(x) для замены на Some(x), .replace(x) для замены на Some(x) с возвратом того, что там было.

#rust
Около минуты