我从代码中获取以下输出:
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}
为什么这里的代码具有此输出?
您正在一次设置整个哈希值作为一个原子操作。Rho使用gdu
的 Current 版本,该版本目前是空的哈希。
要实现所需的目标,请逐步分配值:
gdu = {}
gdu["b"] = 4
gdu["c"] = arr
gdu["d"] = arr.map { |x| x * gdu["b"] } # `to_i` is redundant
gdu["e"] => gdu["b"]
- 至于
"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
,从上面的步骤中很明显。
为什么这里的代码具有此输出?
因为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}
我想你在问为什么" d"one_answers" e"值具有零?
尝试仅运行:
gdu = {}
puts gdu["b"].to_i
您也会看到您在这里也零。因此,您正在获得零,因为" B"尚未设置为任何内容,因为所有值都是同时设置的。