首页 > 解决方案 > Rust LinkedList 第二个可变借用,同时将第一项移动到末尾

问题描述

再会!我试图将第一项移动到链表中的末尾。我有一个这样的链接列表:

let mut list = LinkedList::new();
list.push_back('a');
list.push_back('b');
list.push_back('c');

如果我像这样移动项目:

list.push_back(list.pop_front().unwrap());

Rust 会抛出“第二个可变借用发生”错误。

但是如果在另一行代码中获取第一项:

let str = list.pop_front().unwrap();
list.push_back(str);

然后就好了。

为什么这两段代码的行为不同?我完全不明白。。

标签: rustborrow-checker

解决方案


push_back和都是pop_front保留对列表的可变引用的方法,因此您不能这样做:

list.push_back(list.pop_front().unwrap());

以您指出的另一种方式进行操作,因为您将可变引用放在第一行的末尾:

let str = list.pop_front().unwrap(); // mutable reference dropped here, so it's fine to have another mutable reference afterwards
list.push_back(str);

推荐阅读