Eu tenho dois ditados:
:let defaults = {'hello': 'world', 'bye': 'jupiter'}
:let override = {'hello': 'mars'}
Como posso mesclar as chaves override
para que eu acabe com um novo ditado assim:
{'hello': 'mars', 'bye': 'jupiter'}
Eu tenho dois ditados:
:let defaults = {'hello': 'world', 'bye': 'jupiter'}
:let override = {'hello': 'mars'}
Como posso mesclar as chaves override
para que eu acabe com um novo ditado assim:
{'hello': 'mars', 'bye': 'jupiter'}
Respostas:
Você pode usar extend()
:
:let defaults = {'hello': 'world', 'bye': 'jupiter'}
:let override = {'hello': 'mars'}
:echo extend(defaults, override)
{'hello': 'mars', 'bye': 'jupiter'}
As chaves do segundo argumento substituem as existentes no primeiro. O defaults
ditado será modificado no local , o que pode não ser desejado. Use copy()
para impedir que:
:call extend(copy(defaults), override)
:echo defaults
{'hello': 'world', 'bye': 'jupiter'}
Isso é especialmente algo para se ter cuidado ao passar um ditado para uma função, já que é passado por referência (para que seja modificado fora da função também).
Observe que ele não mesclar dict aninhados, o que pode ou não ser uma coisa boa, dependendo do que você está procurando:
:echo extend({'nest': {'a': 'b'}}, {'nest': {'b': 'XXXX'}})
{'nest': {'b': 'XXXX'}}
Você precisará de uma pequena função auxiliar para mesclar recursivamente dicts aninhados:
" Merge two dictionaries, also recursively merging nested keys.
"
" Use extend() if you don't need to merge nested keys.
fun! s:merge(defaults, override) abort
let l:new = copy(a:defaults)
for [l:k, l:v] in items(a:override)
let l:new[l:k] = (type(l:v) is v:t_dict && type(get(l:new, l:k)) is v:t_dict)
\ ? s:merge(l:new[l:k], l:v)
\ : l:v
endfor
return l:new
endfun
Você pode remover o copy()
se desejar modificá-lo no local (um pouco mais rápido, mas possivelmente inesperado).