rust 填充后不可变的HashMap

rseugnpd  于 2022-11-12  发布在  其他
关注(0)|答案(3)|浏览(177)

下面是一段计算句子中单词出现频率的代码。
我想知道HashMap是否可以设置为不可变后,计数的项目。

let mut map = HashMap::new();
for word in s.split_whitespace() {
    *map.entry(word).or_insert(0) += 1;
}
// after the for loop make map immutable

我知道带有collect API的板条箱Counter,但我更喜欢在没有板条箱的情况下进行。
我也更喜欢一个不使用函数或闭包的解决方案。

bakd9h0s

bakd9h0s1#

除了Aleksander给出的答案,你还可以使用Iterator::fold()来避免一开始就把它变成可变的:

let map = s.split_whitespace().fold(HashMap::new(), |mut map, word| {
    *map.entry(word).or_insert(0) += 1;
    map
});
vlju58qv

vlju58qv2#

如果你想让数据真正的不可改变,例如,确保它在函数调用之间保持有效,你可以将值 Package 在一个实现Deref-Trait. see playground的新类型中。
现在你可以在你的应用程序中传递它,并且依赖于,所有可以改变内部值的代码都必须在sealed模块中。如果你觉得这很有趣,你可能想看看我的实验性板条箱sealedstruct,以获得生成样板的灵感。要知道,它既没有发布,也没有很好的文档。

g2ieeal7

g2ieeal73#

如果你有一个可变的变量,并希望以后使它不可变,你可以做简单的 shadowing

// x is mut
let mut x = ...;

// do stuff with mut x

// now x is no longer mutable
let x = x;

相关问题