我有一个如下所示的数组:

fruits_and_calories = [
  ["apple", 100],
  ["banana", 200],
  ["kumquat", 225],
  ["orange", 90]
]

我还想要在数组的每个元素上调用一个方法:

fruits_and_calories.each do |f| eat(f[0], f[1])

我真的希望能说出类似的话:

fruits_and_calories.each do |f| eat(f[:name], f[:calories])

有没有办法可以在不必更改数组中的每个项目的情况下将其拉出来(例如,通过迭代它并以某种方式添加符号)?或者,如果这太难了,还有更好的选择吗?

有帮助吗?

解决方案

最好的答案是根本不使用数组,而是使用哈希:

fruits_and_calories = { :apple => 100,
                        :banana => 200,
                        :kumquat => 225,
                        :orange => 90}
fruits_and_calories.each do |name, calories| 
  eat(name, calories)
end

其他提示

根本不更改数据结构,您可以更改块参数以实现相同的目的:

fruits_and_calories.each  do |name, calories|  eat(name, calories);  end

这是有效的,因为Ruby会自动将内部数组([“apple”,100]等)扩展到块的参数列表中('do | name,calories | ... end')。这是Ruby从Lisp继承的技巧,称为“解构参数”。

Pesto的答案(使用哈希)是一个很好的答案,但我认为我更喜欢使用结构。

Fruit = Struct.new(:name, :calories)

fruits = [
  Fruit.new("apple", 100),
  Fruit.new("banana", 200),
  Fruit.new("kumquat", 225),
  Fruit.new("orange", 90)
]

fruits.each {|f| eat(f.name, f.calories)}

这也有助于改变 eat 从获取名称和卡路里,到采取水果实例:

fruits.each {|f| eat(f)}

是否有某种原因必须是一个阵列本身?这似乎是一个哈希,或者是一个水果类。

数组总是用数字索引,所以据我所知,使用标准数组是不可能的。

就个人而言,我只是选择使用代码上方的注释来暗示f [0]和f [1]代表什么。

但是,如果你真的想要这样做,我猜一些Array类的鸭子打字工作:


class Array
  def name ; self[0] ; end
  def calories ; self[1] ; end
end

# then call it with:
fruits_and_calories.each {|f| eat(f.name, f.calories) }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top