मैं विम में दो शब्दकोशों का विलय कैसे कर सकता हूं?


9

मेरे पास दो डिकेट हैं:

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

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

मैं चाबियों का विलय कैसे कर सकता हूं overrideताकि मैं एक नए तानाशाह के साथ समाप्त हो जाऊं:

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

जवाबों:


7

आप उपयोग कर सकते हैं extend():

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

:echo extend(defaults, override)
{'hello': 'mars', 'bye': 'jupiter'}

दूसरे तर्क की कुंजी पहले वाले किसी भी मौजूदा को ओवरराइड करती है। defaultsDict किया जाएगा जगह में संशोधित , चाहता था नहीं किया जा सकता है। copy()इसे रोकने के लिए उपयोग करें :

:call extend(copy(defaults), override)
:echo defaults
{'hello': 'world', 'bye': 'jupiter'}

यह विशेष रूप से कुछ है जब आप किसी फ़ंक्शन के लिए एक तानाशाही से गुजर रहे हों, क्योंकि यह संदर्भ द्वारा पारित हो गया है (इसलिए इसे फ़ंक्शन के बाहर भी संशोधित किया जाएगा)।


ध्यान दें कि यह नेस्टेड डक्ट्स को मर्ज नहीं करेगा, जो कि आप के लिए एक अच्छी बात हो सकती है या नहीं, यह इस बात पर निर्भर करता है कि आप क्या देख रहे हैं:

:echo extend({'nest': {'a': 'b'}}, {'nest': {'b': 'XXXX'}})
{'nest': {'b': 'XXXX'}}

आपको नेस्टेड डक्ट्स को पुन: विलय करने के लिए एक छोटे हेल्पर फंक्शन की आवश्यकता होगी:

" 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()यदि आप इसे संशोधित करना चाहते हैं , तो आप इसे हटा सकते हैं (थोड़ी तेज़ी से, लेकिन संभवतः अप्रत्याशित)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.