Ruby:在数组映射

时间:2017-11-22 18:22:46

标签: ruby-on-rails ruby

我有以下哈希键

variable = { "Key1" => ["value1","value2"],
             "Key2" => ["value3","value4"]}

我需要使用索引遍历键的每个值并打印第一个解构参数

我试过

variable.
 values.
 map.
 with_index{|param1, param2, index|
     puts param1
 }

给出了

的输出
["value1", "value2"] 
["value3", "value4"]

我的问题是:为什么要打印完整的价值对象?

我只需要

"value1" 
"value3"

我该怎么做?

1 个答案:

答案 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