def compute(ary)
return nil unless ary
ary.map { |a, b| !b.nil? ? a + b : a }
end
compute([1,2],[3,4])
有人可以向我解释一下计算如何增加内部数组的值吗?
对我而言,似乎在该数组数组上调用map
会将两个数组加在一起,而不是每个数组的内部元素。
答案 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
选择数组数组的第一个数组并将其传递到块中。因此,变量a
和b
指的是第一个数组的内部元素,而不是第一个数组和数组数组中的第二个数组。