Как создать значение со ссылками с подсчетом ссылок на себя при проверке уже заимствованного поля? - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь создать изменяемую структуру B, которая хранит экземпляры другой структуры A, которые содержат ссылки на B. Я хочу такую ​​реализацию, чтобы любая мутация, сделанная с оригинальным B, распространялась на ссылки, хранящиеся в A s.

Однако во время мутации я должен проверить поле из B экземпляр обернут в A экземпляр, тем самым нарушая правило «один изменяемый или много неизменяемый». Мне нужно заимствовать неизменно, в то время как заимствовано заимствовано, но неизменный заем является внутренним для мутирующей функции и не переживает ее объема. с:

thread 'main' panicked at 'already mutably borrowed: BorrowError'

Можно ли выполнить эти требования, используя только Rc<RefCell<B>>? Если нет, я должен погрузиться в unsafe код?

1 Ответ

1 голос
/ 25 марта 2020

Документы для RefCell::borrow говорят:

Паники

Паники, если значение в настоящий момент заимствовано. Для варианта без паники используйте try_borrow.

Использование try_borrow с осознанием того, что любой существующий заем должен быть self (и, следовательно, равен), позволяет Ваш код для компиляции:

let eq = t.try_borrow().map_or(true, |v| v.a == self.a);
assert![eq, "not equal"];

См. также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...