2012-12-25 11 views
5

मैं इस कोड है:यह रूबी हैश क्यों नहीं है जो मैंने सोचा था कि यह होगा?

$ze = Hash.new(Hash.new(2)) 

$ze['test'] = {0=> 'a', 1=>'b', 3 => 'c'} 

$ze[5][0] = 'one' 
$ze[5][1] = "two" 

puts $ze 
puts $ze[5] 

और यह उत्पादन होता है:

{"test"=>{0=>"a", 1=>"b", 3=>"c"}, 5=>{0=>"one", 1=>"two"}} 
{0=>"one", 1=>"two"} 

:

{"test"=>{0=>"a", 1=>"b", 3=>"c"}} 
{0=>"one", 1=>"two"} 

क्यों उत्पादन नहीं है?

+7

वैश्विक चर का उपयोग न करें, वे बदसूरत कर रहे हैं! – Hauleth

उत्तर

5

$ze[5][0] = xxx के साथ आप पहली गेटर $ze की [] बुला रहे हैं, तो बुला सेटर $ze[5] की []=Hash's API देखें।

यदि $ze में कोई कुंजी नहीं है, तो यह आपके डिफ़ॉल्ट मान को वापस कर देगा जिसे आपने Hash.new(2) के साथ प्रारंभ किया था।

$ze[5][0] = 'one' 
# in detail 
$ze[5] # this key does not exist, 
     # this will then return you default hash. 
default_hash[0] = 'one' 

$ze[5][1] = 'two' 
# the same here 
default_hash[1] = 'two' 

आप $ze के लिए कुछ भी जोड़ने नहीं कर रहे हैं, लेकिन आप अपने डिफ़ॉल्ट हैश को कुंजी/मान जोड़े जोड़ रहे हैं। यही कारण है कि आप यह भी कर सकते हैं। आप $ze[5] के समान परिणाम देंगे।

puts $ze[:do_not_exist] 
# => {0=>"one", 1=>"two"} 
+0

ओह! मुझे एहसास नहीं हुआ कि आप डिफ़ॉल्ट हैश को भी संशोधित कर सकते हैं। धन्यवाद। – Turnsole

1
h = Hash.new(2) 
print "h['a'] : "; p h['a'] 

$ze = Hash.new(Hash.new(2)) 
print '$ze[:do_not_exist] : '; p $ze[:do_not_exist] 
print '$ze[:do_not_exist][5] : '; p $ze[:do_not_exist][5] 

$ze = Hash.new{|hash, key| hash[key] = {}} 
$ze['test'] = {0=> 'a', 1=>'b', 3 => 'c'} 
$ze[5][0] = 'one' 
$ze[5][1] = "two" 
print '$ze : '; p $ze 

निष्पादन:

$ ruby -w t.rb 
h['a'] : 2 
$ze[:do_not_exist] : {} 
$ze[:do_not_exist][5] : 2 
$ze : {"test"=>{0=>"a", 1=>"b", 3=>"c"}, 5=>{0=>"one", 1=>"two"}} 
संबंधित मुद्दे

 संबंधित मुद्दे