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
Около минуты
9 декабря 2022