【发布时间】:2022-03-16 00:55:35
【问题描述】:
在目前稳定的Rust中,有没有办法写一个相当于BTreeMap::pop_last的函数?
我能想到的最好的方法是:
fn map_pop_last<K, V>(m: &mut BTreeMap<K, V>) -> Option<(K, V)>
where
K: Ord + Clone,
{
let last = m.iter().next_back();
if let Some((k, _)) = last {
let k_copy = k.clone();
return m.remove_entry(&k_copy);
}
None
}
它可以工作,但它要求密钥是可克隆的。 Rust nightly 中的 BTreeMap::pop_last 没有施加这样的约束。
如果我像这样删除克隆
fn map_pop_last<K, V>(m: &mut BTreeMap<K, V>) -> Option<(K, V)>
where
K: Ord,
{
let last = m.iter().next_back();
if let Some((k, _)) = last {
return m.remove_entry(k);
}
None
}
它导致
error[E0502]: cannot borrow `*m` as mutable because it is also borrowed as immutable
--> ...
|
.. | let last = m.iter().next_back();
| -------- immutable borrow occurs here
.. | if let Some((k, _)) = last {
.. | return m.remove_entry(k);
| ^^------------^^^
| | |
| | immutable borrow later used by call
| mutable borrow occurs here
有没有办法在不对映射键和值类型施加额外限制的情况下解决此问题?
【问题讨论】:
-
我认为不可能在安全的 Rust 中实现这一点。您也许可以从 std 复制源代码块,以获得相同的实现。
-
@PeterHall 不幸的是,source code 使用了
alloc::collections::btree::borrow::DormantMutRef,它无法通过公共 API 访问。您需要重新实现它或找到其他方法。 -
更笼统地说,复制部分不稳定的源代码并不比每晚编译更安全,可能更安全。
-
@Anonyme2000 复制不稳定源的特定部分绝对比每晚使用更安全。
-
@Anonyme2000 是的,您需要复制它使用的所有内部类型,而不仅仅是函数体。
标签: rust