我从代码中得到以下输出:
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}
为什么这里的代码有这个输出?
答案 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”还没有被设置为任何东西,因为所有的值都是同时设置的。