如何重命名 serde_json::Map 中的所有键?
How to rename all keys in a serde_json::Map?
假设我有一个&mut std::collections::HashMap
,我想把所有的键都变成大写。以下代码可以解决问题:
use std::collections::HashMap;
fn keys_to_upper<T>(map: &mut HashMap<String, T>) {
let mut tmp = Vec::with_capacity(map.len());
for (key, val) in map.drain() {
tmp.push((key.to_ascii_uppercase(), val));
}
for (key, val) in tmp {
map.insert(key, val);
}
}
不幸的是,我没有HashMap
而是&mut serde_json::Map
,我想把所有的键都变成大写。没有 .drain()
方法。我可以改用 .into_iter()
,但这只会给我对键和值的可变引用。要再次将它们插入地图,我必须克隆它们,这会影响性能。
这里有什么方法可以解决缺少 .drain()
方法的问题吗?
Rust 程序员工具箱中的一个好工具:std::mem::take
。
这允许您将 &mut T
更改为 T
如果类型实现了默认值(如果没有,但该类型仍然具有您可以使用的 dummy/cheap 值,则 std::mem::replace
是您选择的函数)。
应用于您当前的 use-case 得到:
use serde_json::{Map, Value};
fn keys_to_upper<T>(map: &mut Map<String, Value>) {
*map = std::mem::take(map)
.into_iter()
.map(|(k, v)| (k.to_ascii_uppercase(), v))
.collect();
}
假设我有一个&mut std::collections::HashMap
,我想把所有的键都变成大写。以下代码可以解决问题:
use std::collections::HashMap;
fn keys_to_upper<T>(map: &mut HashMap<String, T>) {
let mut tmp = Vec::with_capacity(map.len());
for (key, val) in map.drain() {
tmp.push((key.to_ascii_uppercase(), val));
}
for (key, val) in tmp {
map.insert(key, val);
}
}
不幸的是,我没有HashMap
而是&mut serde_json::Map
,我想把所有的键都变成大写。没有 .drain()
方法。我可以改用 .into_iter()
,但这只会给我对键和值的可变引用。要再次将它们插入地图,我必须克隆它们,这会影响性能。
这里有什么方法可以解决缺少 .drain()
方法的问题吗?
Rust 程序员工具箱中的一个好工具:std::mem::take
。
这允许您将 &mut T
更改为 T
如果类型实现了默认值(如果没有,但该类型仍然具有您可以使用的 dummy/cheap 值,则 std::mem::replace
是您选择的函数)。
应用于您当前的 use-case 得到:
use serde_json::{Map, Value};
fn keys_to_upper<T>(map: &mut Map<String, Value>) {
*map = std::mem::take(map)
.into_iter()
.map(|(k, v)| (k.to_ascii_uppercase(), v))
.collect();
}