Метод and_modify
Метод and_modify возвращает модифицированную запись
Entry, позволяя применить замыкание к значению,
если ключ уже присутствует в хеш-таблице.
Если ключ отсутствует, замыкание не вызывается,
а значение будет вставлено с помощью последующего вызова
or_insert, or_insert_with или or_default.
Параметром метод принимает замыкание, которое получает
изменяемую ссылку на значение и может его модифицировать.
Синтаксис
entry.and_modify(f)
Пример
Давайте увеличим значение, связанное с ключом "a",
если он уже присутствует в хеш-таблице:
use std::collections::HashMap;
fn main()
{
let mut map = HashMap::new();
map.insert("a", 1);
map.entry("a")
.and_modify(|v| *v += 10)
.or_insert(0);
println!("{:?}", map);
}
Результат выполнения кода:
{"a": 11}
Пример
Давайте попробуем модифицировать значение по ключу "b",
которого нет в хеш-таблице.
Замыкание в and_modify не выполнится,
а or_insert добавит новое значение:
use std::collections::HashMap;
fn main()
{
let mut map = HashMap::new();
map.insert("a", 1);
map.entry("b")
.and_modify(|v| *v += 10)
.or_insert(5);
println!("{:?}", map);
}
Результат выполнения кода:
{"a": 1, "b": 5}
Пример
Давайте посчитаем, сколько раз встречается каждое слово
в векторе, используя and_modify и or_insert:
use std::collections::HashMap;
fn main()
{
let words = vec!["a", "b", "a", "c", "a", "b"];
let mut map = HashMap::new();
for word in words
{
map.entry(word)
.and_modify(|count| *count += 1)
.or_insert(1);
}
println!("{:?}", map);
}
Результат выполнения кода:
{"a": 3, "b": 2, "c": 1}
Смотрите также
-
метод
or_insert,
который вставляет значение, если ключ отсутствует -
метод
or_insert_with,
который вставляет значение, вычисленное замыканием -
метод
or_default,
который вставляет значение по умолчанию -
метод
entry,
который возвращает запись Entry для указанного ключа