使用函数填充Ruby哈希

时间:2017-08-30 03:46:15

标签: ruby hash

我从代码中得到以下输出:

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}

为什么这里的代码有这个输出?

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"]

答案 1 :(得分: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,从上面的步骤可以看出这一点。

答案 2 :(得分: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}

答案 3 :(得分:2)

我想你在问为什么“d”和“e”值有零?

尝试运行:

gdu = {}
puts gdu["b"].to_i
你会发现你在这里也是零。所以你得零,因为“b”还没有被设置为任何东西,因为所有的值都是同时设置的。