मेरे पास दो डिकेट हैं:
:let defaults = {'hello': 'world', 'bye': 'jupiter'}
:let override = {'hello': 'mars'}
मैं चाबियों का विलय कैसे कर सकता हूं override
ताकि मैं एक नए तानाशाह के साथ समाप्त हो जाऊं:
{'hello': 'mars', 'bye': 'jupiter'}
मेरे पास दो डिकेट हैं:
:let defaults = {'hello': 'world', 'bye': 'jupiter'}
:let override = {'hello': 'mars'}
मैं चाबियों का विलय कैसे कर सकता हूं override
ताकि मैं एक नए तानाशाह के साथ समाप्त हो जाऊं:
{'hello': 'mars', 'bye': 'jupiter'}
जवाबों:
आप उपयोग कर सकते हैं extend()
:
:let defaults = {'hello': 'world', 'bye': 'jupiter'}
:let override = {'hello': 'mars'}
:echo extend(defaults, override)
{'hello': 'mars', 'bye': 'jupiter'}
दूसरे तर्क की कुंजी पहले वाले किसी भी मौजूदा को ओवरराइड करती है। defaults
Dict किया जाएगा जगह में संशोधित , चाहता था नहीं किया जा सकता है। 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()
यदि आप इसे संशोधित करना चाहते हैं , तो आप इसे हटा सकते हैं (थोड़ी तेज़ी से, लेकिन संभवतः अप्रत्याशित)।