Каковы варианты прекращения изменчивого заимствования в Rust?

Я сражаюсь с заемщиком по займам – удивляюсь.

Хотя я нашел решение, добавив закрытие, мне любопытно, есть ли другие способы прекратить изменчивый заимствование, чтобы следующий оператор мог получить доступ к привязке позже.

Вот что я сделал до сих пор:

let mut canvas: Canvas = Canvas { width: 5, height: 5, array: vec!['x'; 5*5], }; { let mut renderer: CanvasRenderer = CanvasRenderer::new(&mut canvas); renderer.render_point('x', 3, 3); } println!("The Value in the array is: {}", canvas.array[9]); 

Я закрываю привязку к объекту CanvasRenderer и после мутации canvasа и CanvasRenderer области CanvasRenderer умирает, а мой CanvasRenderer заимствованный canvas доступен для чтения или что-то еще.

Это работает, но теперь я хотел бы увидеть другие решения!

Я слышал о drop(stuff) но это не сработало, как я думал.

Другого пути нет. Использование блоков – это способ сделать это. В настоящее время в Rust все записи лексики, то есть они всегда соответствуют некоторому лексическому охвату. Единственный масштаб, который больше, чем один оператор, – это блок, поэтому блоки – это ваш единственный инструмент для ограничения объема займов.

drop() не будет работать по двум причинам: во-первых, потому что для него потребуется нелексическая область действия, которая не поддерживается в Rust (пока), а во-вторых, она не может быть универсальным инструментом для управления записями: например, «Невозможно положить конец неизменному заимствованию просто потому, что неизменяемые ссылки являются Copy и не могут быть« сброшены ». Поэтому, если мы получаем нелексические записи, drop() может работать на изменяемые записи, но я сомневаюсь, что это будет идиоматический подход.

Тем не менее, в настоящее время внутренние структуры Rust подвергаются рефакторингу MIR, специальному промежуточному представлению вашего кода, что должно облегчить, в частности, рассуждения о объемах займов. Насколько я помню, вся работа над нелексическими записями была отложена до тех пор, пока МИР не будет готова; впоследствии, я полагаю, таких изменений было бы намного легче сделать.

  • Итератор возвращает предметы по ссылке, срок службы
  • Как напечатать тип переменной в Rust?
  • Как реализовать черту, которой я не владею, для типа, которым я не владею?
  • Как искать и вставлять в HashMap эффективно?
  • Есть ли способ подсчета с помощью макросов?
  • Когда возвращался результат потребления StdinLock, почему заем в stdin сохранялся?
  • Как отключить предупреждения о неиспользуемом коде в Rust?
  • Что такое нелексические времена жизни?
  • Есть ли способ вернуть ссылку на переменную, созданную в функции?
  • Ошибка генериков: ожидаемый тип параметра, найденная структура
  • Когда реализуются блокировки Fn, FnMut и FnOnce?
  • Давайте будем гением компьютера.