Вам разрешено иметь только одну изменяемую ссылку на значение за раз.Когда вы изменчиво перезагружаетесь в качестве аргумента, компилятору будет тривиально видеть, что вы не собираетесь использовать ref_string
одновременно, и, следовательно, код безопасен.
Мой мысленный образ таков, что для изменчивости есть «цепь опеки».ref_string
является держателем и может временно отдать его до временного значения, созданного &mut *ref_string
.Когда это выходит за рамки, изменчивость возвращается к нему.Это как если бы код был:
{
let x = &mut *ref_string;
test(x);
}
Однако, когда вы пытаетесь «обойти» и получить изменяемую ссылку, вы игнорируете цепочку опеки.Компилятор останавливает вас, потому что он не может тривиально увидеть, что это безопасно.
Следует отметить, что нелексические времена жизни улучшают исходную ситуацию.Когда включена проверка заимствования на основе MIR, компилятор может видеть, что ref_string
больше не используется к тому времени, когда происходит второй вызов test
, поэтому безопасно передавать туда эксклюзивный доступ.