İki diktim var:
:let defaults = {'hello': 'world', 'bye': 'jupiter'}
:let override = {'hello': 'mars'}
Anahtarları nasıl birleştirebilirim, override
böylece yeni bir diksiyonla sonuçlanırım:
{'hello': 'mars', 'bye': 'jupiter'}
İki diktim var:
:let defaults = {'hello': 'world', 'bye': 'jupiter'}
:let override = {'hello': 'mars'}
Anahtarları nasıl birleştirebilirim, override
böylece yeni bir diksiyonla sonuçlanırım:
{'hello': 'mars', 'bye': 'jupiter'}
Yanıtlar:
Şunları kullanabilirsiniz extend()
:
:let defaults = {'hello': 'world', 'bye': 'jupiter'}
:let override = {'hello': 'mars'}
:echo extend(defaults, override)
{'hello': 'mars', 'bye': 'jupiter'}
İkinci bağımsız değişkenin anahtarları, ilk bağımsız değişkende bulunanları geçersiz kılar. Söz defaults
konusu değişiklik istenmeyecek şekilde değiştirilecektir . copy()
Bunu önlemek için kullanın :
:call extend(copy(defaults), override)
:echo defaults
{'hello': 'world', 'bye': 'jupiter'}
Bu, özellikle bir işleve bir dikteyi iletirken dikkatli olmanız gereken bir şeydir, çünkü referans ile iletilir (böylece fonksiyonun dışında da değiştirilir).
Aradığınıza bağlı olarak, iyi bir şey olabilecek veya olmayabilecek iç içe dikleri birleştirmeyeceğini unutmayın:
:echo extend({'nest': {'a': 'b'}}, {'nest': {'b': 'XXXX'}})
{'nest': {'b': 'XXXX'}}
Yuvalanmış dikmeleri tekrar tekrar birleştirmek için küçük bir yardımcı fonksiyona ihtiyacınız olacak:
" 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
copy()
Yerinde değiştirmek isterseniz (biraz daha hızlı, ancak muhtemelen beklenmedik) öğesini kaldırabilirsiniz .