Vim'deki iki sözlüğü nasıl birleştirebilirim?


9

İki diktim var:

:let defaults = {'hello': 'world', 'bye': 'jupiter'}

:let override = {'hello': 'mars'}

Anahtarları nasıl birleştirebilirim, overrideböylece yeni bir diksiyonla sonuçlanırım:

{'hello': 'mars', 'bye': 'jupiter'}

Yanıtlar:


7

Ş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 defaultskonusu 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 .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.