Возможно ... но мне жаль, что у меня не было более элегантного решения.
Трюк НЕ заимствовать у anchor
и, следовательно, жонглировать между двумя аккумуляторами:
Это приводит меня к:
impl Recursive {
fn back(&mut self) -> &mut Link {
let mut anchor = &mut self.root;
loop {
let tmp = anchor;
if let Some(ref mut node) = *tmp {
anchor = &mut node.next;
} else {
anchor = tmp;
break;
}
}
anchor
}
}
Не совсем красиво, но это что-то, что может проверить заемщик ¯ \ _ (ツ) _ / ¯.
@ker улучшил это, создав неназванное временное:
impl Recursive {
fn back(&mut self) -> &mut Link {
let mut anchor = &mut self.root;
loop {
match {anchor} {
&mut Some(ref mut node) => anchor = &mut node.next,
other => return other,
}
}
}
}
Фокус здесь в том, что использование {anchor}
перемещает содержимое anchor
в неназванное временное, на котором выполняется совпадение. Поэтому в блоке match
мы не заимствуем из anchor
, а из временного, оставляя нас свободными изменять anchor
. См. Связанный пост в блоге Материал, который выполняет функция идентификации (в русте) .
Вы можете отключить интерпретацию тегов внутри блока {% raw %}
:
{% raw %}
Anything in this block is treated as raw text,
including {{ curly braces }} and
{% other block-like syntax %}
{% endraw %}
См. раздел Escaping документации по шаблону.