আপনি অলস হতে পারেন এবং এটিতে একটি জড়ান lambda
:
my_hash = YAML.load_file('yml')
my_lamb = lambda { |key| my_hash[key.to_s] }
my_lamb[:a] == my_hash['a'] #=> true
তবে এটি কেবল হ্যাশ থেকে পড়ার জন্য কাজ করবে - লেখার জন্য নয়।
এটি করতে, আপনি ব্যবহার করতে পারেন Hash#merge
my_hash = Hash.new { |h,k| h[k] = h[k.to_s] }.merge(YAML.load_file('yml'))
থিম ব্লকটি চাওয়াগুলিতে একবারে কীগুলিকে রূপান্তরিত করবে, যদিও আপনি প্রতীক সংস্করণটি অ্যাক্সেস করার পরে কীটির স্ট্রিং সংস্করণের জন্য মান আপডেট করেন তবে প্রতীক সংস্করণটি আপডেট হবে না।
irb> x = { 'a' => 1, 'b' => 2 }
#=> {"a"=>1, "b"=>2}
irb> y = Hash.new { |h,k| h[k] = h[k.to_s] }.merge(x)
#=> {"a"=>1, "b"=>2}
irb> y[:a] # the key :a doesn't exist for y, so the init block is called
#=> 1
irb> y
#=> {"a"=>1, :a=>1, "b"=>2}
irb> y[:a] # the key :a now exists for y, so the init block is isn't called
#=> 1
irb> y['a'] = 3
#=> 3
irb> y
#=> {"a"=>3, :a=>1, "b"=>2}
আপনারও থ্রো ব্লকটি হ্যাশ আপডেট না করে থাকতে পারে, যা আপনাকে এই ধরণের ত্রুটি থেকে রক্ষা করতে পারে তবে আপনি তারপরেও বিপরীতে ঝুঁকছেন - প্রতীক সংস্করণটি আপডেট করা স্ট্রিংয়ের সংস্করণটি আপডেট করবে না:
irb> q = { 'c' => 4, 'd' => 5 }
#=> {"c"=>4, "d"=>5}
irb> r = Hash.new { |h,k| h[k.to_s] }.merge(q)
#=> {"c"=>4, "d"=>5}
irb> r[:c] # init block is called
#=> 4
irb> r
#=> {"c"=>4, "d"=>5}
irb> r[:c] # init block is called again, since this key still isn't in r
#=> 4
irb> r[:c] = 7
#=> 7
irb> r
#=> {:c=>7, "c"=>4, "d"=>5}
সুতরাং এগুলি সম্পর্কে যত্নবান হওয়ার বিষয়টি হ'ল দুটি মূল ফর্মের মধ্যে স্যুইচ করা। একটি সঙ্গে লাঠি।