#rust #serde
#Ржавчина #serde
Вопрос:
Итак, у меня Value
откуда-то есть serde, и я хотел бы добавить дополнительные «поля» к Value
нему, прежде чем десериализовать его впоследствии. Я просматриваю документы, но не вижу, как это сделать.
Более конкретно, допустим, у меня есть хэш-карта, значения которой я хочу объединить в значение.
pub fn merge(v: amp;Value, fields: amp;HashMap<String, String>) -> Value
Ответ №1:
Вам нужно извлечь карту (в Value::Object
случае), скопировать ее (поскольку вы принимаете только amp;Value
входные данные), обновить ее и повторно обернуть в Value::Object
, например
pub fn merge(v: amp;Value, fields: amp;HashMap<String, String>) -> Value {
match v {
Value::Object(m) => {
let mut m = m.clone();
for (k, v) in fields {
m.insert(k.clone(), Value::String(v.clone()));
}
Value::Object(m)
}
v => v.clone(),
}
}
(при конфликте это приведет к замене v
записей ‘s на fields
‘s).
Комментарии:
1. И обратите внимание, что метод мог бы быть намного более эффективным, если бы он принимал аргументы по значению, поскольку ему не нужно было бы их копировать. Он мог бы обновить
Object
карту на месте, а мог бы просто вернуть все остальное как есть. Он также может приниматьv
по изменяемой ссылке и обновлять карту на месте (в этом случае он ничего не должен возвращать, или он должен возвращать изменяемую ссылкуv
, которую он получает в качестве входных данных).