আপনি ব্যবহার করতে পারেন extend()
:
:let defaults = {'hello': 'world', 'bye': 'jupiter'}
:let override = {'hello': 'mars'}
:echo extend(defaults, override)
{'hello': 'mars', 'bye': 'jupiter'}
দ্বিতীয় আর্গুমেন্টের কীগুলি প্রথমে বিদ্যমান বিদ্যমানগুলিকে ওভাররাইড করে। defaults
অভি করা হবে জায়গা পরিবর্তন , চেয়েছিলেন নাও হতে পারে পারে। 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()
যদি এটি জায়গায় রেখে (কিছুটা দ্রুত, তবে সম্ভবত অপ্রত্যাশিত) পরিবর্তন করতে চান তবে আপনি এটিকে সরাতে পারেন।