使用功能填充红宝石哈希



我从代码中获取以下输出:

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"尚未设置为任何内容,因为所有值都是同时设置的。

最新更新