2017-08-30 33 views
2

我從代碼的輸出如下:使用函數來填充紅寶石哈希

arr = [1,2,3] 
gdu = {} 
gdu = { 
     "b" => 4, 
     "c" => arr, 
     "d" => arr.map {|x| x * gdu["b"].to_i }, 
     "e" => gdu["b"].to_i 
} 
gdu.default = "value does not exit in hash gdu" 
gdu # => {"b"=>4, "c"=>[1, 2, 3], "d"=>[0, 0, 0], "e"=>0} 

爲什麼這裏的代碼有這個輸出?

+1

你能具體談談你所驚訝或不理解? –

+0

好吧,我期望gdu [「d」]輸出[4,8,12]和「e」爲4 –

+0

好吧,看我的答案然後 –

回答

5

您正在設置整個散列的值,作爲一個原子操作。 RHO使用當前的版本gdu,這是目前空的散列。

達到你想要的東西,賦值一步一步:

gdu = {} 
gdu["b"] = 4 
gdu["c"] = arr 
gdu["d"] = arr.map { |x| x * gdu["b"] } # `to_i` is redundant 
gdu["e"] => gdu["b"] 
+0

我現在看到了。我認爲我可以在定義哈希的同時將「e」的值設置爲「b」,但是會發生什麼情況是聲明會訪問內存中已存在的空哈希。 –

2

我想你是問爲什麼「d」和「e」值有零?

儘量只運行:

gdu = {} 
puts gdu["b"].to_i 

你會看到你零這裏。所以你得到零,因爲「b」還沒有被設置爲任何東西,因爲所有的值都是同時設置的。

3
  • 至於"b" => 4,它應該是微不足道的。
  • "c" => [1, 2, 3]arr = [1,2,3]開始。
  • 至於"d" => [0, 0, 0],它是這樣的:

    gdu    # => {} 
    gdu["b"]   # => nil 
    gdu["b"].to_i  # => 0 
    x * gdu["b"].to_i # => 0 
    arr.map {|x| x * gdu["b"].to_i } # => [1, 2, 3].map {|x| 0} # => [0, 0, 0] 
    
  • 至於"e" => 0,它是從上面的步驟明顯。

3

爲什麼這裏的代碼有這個輸出?

由於Ruby首先評估賦值的右側,然後將結果(新散列)分配給gdu

如果你分開的哈希創建和分配它變得很明顯:

arr = [1,2,3] 
gdu = {} 

hash = { 
     "b" => 4, 
     "c" => arr, 
     "d" => arr.map {|x| x * gdu["b"].to_i }, 
     "e" => gdu["b"].to_i 
} 
#=> {"b"=>4, "c"=>[1, 2, 3], "d"=>[0, 0, 0], "e"=>0} 

gdu = hash 
#=> {"b"=>4, "c"=>[1, 2, 3], "d"=>[0, 0, 0], "e"=>0}