2017-08-30 91 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}