⚡️ Забудь про RefCell для примитивов
Вам нужно изменить поле внутри неизменяемой структуры (
Рука тянется к
1. Хранит счетчик заимствований (borrow count).
2. В рантайме проверяет правила (может паниковать!).
Если ваш тип реализует
В чем магия
У него нет никакого рантайм-оверхеда. Вообще. Он не проверяет заимствования.
Он работает так: "Я даю тебе копию значения" (
Это атомарно? Нет. Это работает только в одном потоке. Но для однопоточного кода (или внутри
#rust #std #optimization #interior_mutability
👉 @rust_lib
Вам нужно изменить поле внутри неизменяемой структуры (
&self).Рука тянется к
RefCell? Стоп.RefCell имеет оверхед:1. Хранит счетчик заимствований (borrow count).
2. В рантайме проверяет правила (может паниковать!).
Если ваш тип реализует
Copy (числа, bool, маленькие структуры) - используйте Cell.В чем магия
Cell?У него нет никакого рантайм-оверхеда. Вообще. Он не проверяет заимствования.
Он работает так: "Я даю тебе копию значения" (
get) или "Я заменяю значение целиком" (set). Вы не можете получить ссылку (&) на содержимое Cell, поэтому правила Rust не нарушаются.
use std::cell::Cell;
struct Metric {
count: Cell<u64>, // Zero overhead
}
impl Metric {
fn inc(&self) {
// Мы меняем значение по неизменяемой ссылке &self
let current = self.count.get();
self.count.set(current + 1);
}
}
Это атомарно? Нет. Это работает только в одном потоке. Но для однопоточного кода (или внутри
thread_local) это самая быстрая мутабельность, которая только возможна.#rust #std #optimization #interior_mutability
👉 @rust_lib
👍13✍6❤1🥰1🤗1