gpt4 book ai didi

dictionary - 如何重命名serde_json::Map中的所有键?

转载 作者:行者123 更新时间:2023-12-03 11:34:05 24 4
gpt4 key购买 nike

假设我有一个&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(),但这只会给我对键和值的可变引用。要将它们再次插入到 map 中,我将不得不克隆它们,这会影响性能。
有什么办法可以解决 .drain()方法的缺失吗?

最佳答案

Rust程序员工具箱中的一个不错的工具: std::mem::take
如果类型实现了默认值,则可以将&mut T更改为T(如果没有实现,则该类型仍具有您可以使用的哑元/便宜值,那么 std::mem::replace 是您选择的功能)。
应用于您当前的用例,可以得到:

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();
}

关于dictionary - 如何重命名serde_json::Map中的所有键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63308424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com