Arrays 如何从哈希键构建新的Ruby数组

Arrays 如何从哈希键构建新的Ruby数组,arrays,ruby,hash,Arrays,Ruby,Hash,我想从以下格式的散列开始构建一个新数组: HashConst = {[120,240] => 60, [240,480]=> 30} #Constant 我需要构建一个新数组,并按以下格式将值赋给一个新常量: [ [[120,240] ,1], [[240,480], 1] ] 我试过: NewArrayConst = HashConst.keys.each{ |res| [res, 1]} 但我得到的是 [ [120,240], [240,480] ] 我找到的唯一解决方案

我想从以下格式的散列开始构建一个新数组:

HashConst = {[120,240] => 60, [240,480]=> 30} #Constant
我需要构建一个新数组,并按以下格式将值赋给一个新常量:

[ [[120,240] ,1], [[240,480], 1] ]
我试过:

NewArrayConst = HashConst.keys.each{ |res| [res, 1]}
但我得到的是

[ [120,240], [240,480] ]
我找到的唯一解决方案是:

  tempVar = []
  HashConst.keys.each_with_index{ |res,idx| tempVar [idx] = [res, 1]}
  NewArrayConst = tempVar 
任何人都知道一个更好的解决方案,并且可以解释为什么我无法从
NewArrayConst=HashConst.keys.each{res}[res,1]}
获得预期的输出。我正在使用
2.2.2-p95

编辑:


正如许多人指出的那样,Hash-var名称是错误的和误导性的,我已经更新了,为了避免混淆,您需要使用
map
,而不是
每个

方法不返回在块中执行的代码的结果,而是只返回调用每个
的数组,在您的情况下,该数组是
hash.keys
的值

将块返回的值收集到数组中

hash = {[120,240] => 60, [240,480]=> 30}
p array = hash.keys.map{ |res| [res, 1]}
#=> [[[120, 240], 1], [[240, 480], 1]]


注意:不要命名变量
Hash
,因为它在Ruby中已经是一个众所周知的类。如果需要,请使用小写字母
哈希
。此外,对于变量名,如
NewArrayConst
,请避免使用驼峰大小写,因为Ruby建议使用
snake\u case
来命名变量-您可以参考更多详细信息。

您需要使用
map
而不是
每个

方法不返回在块中执行的代码的结果,而是只返回调用每个
的数组,在您的情况下,该数组是
hash.keys
的值

将块返回的值收集到数组中

hash = {[120,240] => 60, [240,480]=> 30}
p array = hash.keys.map{ |res| [res, 1]}
#=> [[[120, 240], 1], [[240, 480], 1]]



注意:不要命名变量
Hash
,因为它在Ruby中已经是一个众所周知的类。如果需要,请使用小写字母
哈希
。另外,对于变量名,如
NewArrayConst
,请避免使用驼峰大小写,因为Ruby建议使用
snake\u case
来命名变量-您可以参考更多详细信息。

您是否尝试过
散列?有时候事情比你想象的要容易。

你有没有尝试过散列。要_a
?有时候事情比你想象的要简单。

这很有效,谢谢你的解释。我错误地认为每个人都收集并返回了执行的expression@mgtemp在什么意义上?我的意思是,如果你需要创建一个新数组,你需要创建一个新数组。@mgtemp与什么相比?这里有一个校对链接就好了。
Hash
是一个“著名”的类吗?从来没有听说过。@CarySwoveland可能应该命名为
Hush
,这很有效,谢谢你的解释。我错误地认为每个人都收集并返回了执行的expression@mgtemp在什么意义上?我的意思是,如果你需要创建一个新数组,你需要创建一个新数组。@mgtemp与什么相比?这里有一个校对链接就好了。
Hash
是一个“著名”的类吗?从来没有听说过。@CarySwoveland可能它应该被命名为
Hush
你为什么不把它留给@maza。to_a给了我们“[[120,240],60],[240,480],30]]”,这是@maza描述的格式。但不是他们真正想要的。我看不出有什么混乱。像往常一样,@Dave很挑剔。你为什么不让@maza来决定呢。to_a给了我们“[[[120240],60],[240480],30]]”,这是@maza描述的格式。但不是他们真正想要的。我看不出有什么混乱。像往常一样,@Dave很挑剔。你使用的正是类
散列
。重新定义它是一个糟糕的想法。您正在使用的正是类
散列
。重新定义它是一个糟糕的想法。这样做的好处是“提前”知道生成的结构有多大,因此,如果像mgtemp建议的那样在
映射过程中涉及内存重新分配,它们可能是可以避免的。这样做的好处是“提前”知道生成的结构有多大,因此,如果像mgtemp建议的那样,在映射过程中涉及内存重新分配,那么它们可能是可以避免的。
h = {[120,240] => 60, [240,480]=> 30}
val = 1

h.keys.product([val])
  #=> [[[120, 240], 1], [[240, 480], 1]]