迭代数组数组

时间:2014-07-18 15:08:13

标签: ruby arrays map enumerable

def compute(ary)
  return nil unless ary
  ary.map { |a, b| !b.nil? ? a + b : a }
end

compute([1,2],[3,4])

有人可以向我解释一下计算如何增加内部数组的值吗?

对我而言,似乎在该数组数组上调用map会将两个数组加在一起,而不是每个数组的内部元素。

2 个答案:

答案 0 :(得分:3)

map基本上遍历对象的元素:

foo = [
  ['a', 'b'],
  ['c', 'd']
]

foo.map{ |ary| puts ary.join(',') }
# >> a,b
# >> c,d

在此示例中,它传递了每个子阵列,分配给ary

看一下有点不同:

foo.map{ |ary| puts "ary is a #{ary.class}" }
# >> ary is a Array
# >> ary is a Array

因为Ruby允许我们一次分配多个值,所以可以编写:

foo.map{ |item1, item2| puts "item1: #{ item1 }, item2: #{ item2 }" }
# >> item1: a, item2: b
# >> item1: c, item2: d

如果map正在迭代哈希数组,则每次迭代都会产生一个子哈希:

foo = [
  {'a' => 1},
  {'b' => 2}
]

foo.map{ |elem| puts "elem is a #{ elem.class }" }
# >> elem is a Hash
# >> elem is a Hash

如果map正在遍历散列,则每次迭代都会产生该块的键/值对:

foo = {
  'a' => 1,
  'b' => 2
}

foo.map{ |k, v| puts "k: #{k}, v: #{v}" }
# >> k: a, v: 1
# >> k: b, v: 2

但是,如果您只为块提供一个参数,Ruby会将键和值分配给变量,以便您将其视为数组:

foo.map{ |ary| puts "ary is a #{ary.class}" }
# >> ary is a Array
# >> ary is a Array

因此,您必须了解在迭代容器时发生的多种事情,并且当Ruby将值传递到map块时。

除此之外,记住map将为传入的每件事物返回一个或多个值,这一点非常重要。map,AKA collect,用于转换值。它不应该用作each的替代,它只能迭代。在上面的所有示例中,我都没有真正显示map正确使用,因为我试图展示传入的元素会发生什么。通常我们会做类似的事情:

foo = [['a', 'b'], ['c', 'd']]
foo.map{ |ary| ary.join(',') }
# => ["a,b", "c,d"]

或者:

bar = [[1,2], [3,4]]
bar.collect{ |i, j| i * j }
# => [2, 12]

还有map!更改正在迭代的对象,而不是返回值。我建议避免使用map!,直到你很清楚为什么它对你有用,因为除非他们理解变量如何传递以及如何传递,否则似乎会让人感到困惑。和哈斯工作。

最好的办法是在IRB中使用map。您将能够更轻松地了解发生的事情。

答案 1 :(得分:0)

我想我自己想出来了。

map选择数组数组的第一个数组并将其传递到块中。因此,变量ab指的是第一个数组的内部元素,而不是第一个数组和数组数组中的第二个数组。