我有以下哈希键
variable = { "Key1" => ["value1","value2"],
"Key2" => ["value3","value4"]}
我需要使用索引遍历键的每个值并打印第一个解构参数。
我试过
variable.
values.
map.
with_index{|param1, param2, index|
puts param1
}
给出了
的输出["value1", "value2"]
["value3", "value4"]
我的问题是:为什么要打印完整的价值对象?
我只需要
"value1"
"value3"
我该怎么做?
答案 0 :(得分:0)
我假设variable
实际上只是一个哈希值,因为它适合您正在运行的代码以及您看到最佳效果的结果,如果不是这个答案需要一些稍作修改,但整体仍然应该是相关的
variable = { "Key1" => ["value1", "value2"], "Key2" => ["value1", "value2"] }
通常当您致电map
时,传入的元素(如果适用)可以解构:
variable.values.map { |p1, p2| puts p1 }
# value1
# value1
但是,当你在其上调用with_index
时,它会改变行为,以便传递的第一个参数是Enumerable中的元素,第二个参数是索引:
variable.values.map.with_index { |p1, p2| puts p1.inspect }
# ["value1", "value2"]
# ["value1", "value2"]
所以,如果你开始尝试解构多个参数,事情变得模棱两可(例如,如果那个第二个项目,在这种情况下是一个整数索引实际上是另一个数组;什么参数与什么数组相关;如果你的第一个参数有5个元素,你为块提供3个参数,解释器认为你应该做什么?),你需要使用特殊的语法。您只需要在括号中包含第一个元素的参数名称:
variable.values.map.with_index do |(param1, param2), index|
puts "p1: #{param1}; p2: #{param2}; index: #{index}"
end
# p1: value1; p2: value2; index: 0
# p1: value1; p2: value2; index: 1
最后,如果您只对每个值数组的第一个元素感兴趣,您可以将数组的其余部分分配给未使用的变量,例如:
variable.values.map.with_index do |(param1, *), index|
puts "p1: #{param1}; index: #{index}"
end
# p1: value1; index: 0
# p1: value1; index: 1
当然,由于这实际上并未将值映射到任何内容,因此这也适用于each.with_index
。