我想将更多数组推入此哈希?

I want to push more arrays into this Hash?

我想把数组压入这部分,我是Ruby

的新手
@edge_weights = {[position, position2] => node_distance}

那是哈希?我想我想以相同的方式推送一些其他哈希以获得这样的结果:

{["1", "2"]=>2445, ["2", "3"]=>2015, ["2", "4"]=>1547, ["3", "4"]=>939, ["5", "1"]=>1548}

不是这样的:

{["1", "2"]=>111},{["2", "3"]=>222},{["1", "3"]=>333}

我怎样才能做到这一点?。抱歉我的英语不好:(

大概您将从一些数据开始,例如以下数组:

arr = [["1", "2", 2445], ["2", "3", 2015], ["2", "4", 1547],
       ["3", "4", 939], ["5", "1", "7", 1548], ["1", "2", -71]]

第一步是创建一个空哈希:

h = {}

现在遍历 arr 的元素以构建散列 h

arr.each do |a|
  *first, last = a
  h[first] = last
end
  #=> [["1", "2", 2445], ["2", "3", 2015], ["2", "4", 1547],
  #    ["3", "4", 939], ["5", "1", "7", 1548], ["1", "2", -71]]

我们要h的值,而不是上面的return值。

h #=> {["1", "2"]=>-71, ["2", "3"]=>2015, ["2", "4"]=>1547,
  #    ["3", "4"]=>939, ["5", "1"]=>1548, ["5", "1", "7"]=>1548}

注意 Ruby 的 splat 运算符1 用于以各种方式分解数组:

*first, last = ["5", "1", "7", 1548]
first
  #=> ["5", "1", "7"]
last
  #=> 1548

以上 h 的结果是否符合您的预期?回想一下,散列具有唯一键。 arr 的第一个元素传递给我们执行的块后

h[["1", "2"]] = 2445

这样 h 就变成了 { ["1", "2"]=>2445 }。稍后,当 arr 的最后一个元素——具有相同键值 (["1", "2"])——传递给块时,我们执行

h[["1", "2"]] = -71

覆盖那个键的值。如果您希望保留遇到的 first 键的值,您可以编写

arr.each do |a|
  *first, last = a
  h[first] = last unless h.key?(first)
end

参见 Hash#key?(又名 has_key?include?)。 (另外:你可以写 ...if !h.key?(first)! 读作 而不是 ,但通常更清楚地使用 unless 来避免取反。)

写原始构造的"Ruby way"是使用方法Enumerable#each_with_object和splat块变量a:

arr.each_with_object({}) do |(*first, last),h|
  h[first] = last
end
  #=> {["1", "2"]=>-71, ["2", "3"]=>2015, ["2", "4"]=>1547,
  #    ["3", "4"]=>939, ["5", "1"]=>1548, ["5", "1", "7"]=>1548}

这避免了需要使用单独的语句来创建空哈希和代码块 returns h 的值。

(看不懂也不用担心)

构造散列的另一种常用方法是使用方法 Hash#update(又名 merge!):

arr.each_with_object({}) do |(*first, last),h|
  h.update({ first=>last })
end

注意 Ruby 允许第二行的 shorthand 版本:

  h.update(first=>last)

1 参见 "Multiple variable assignment" here

您可以将数组作为 key 传递并为其分配 value

> edge_weights = {}
> edge_weights[["1","2"]] = 2445
> edge_weights[["2", "4"]] = 1547
> edge_weights
#=> {["1", "2"]=>2445, ["2", "4"]=>1547}