def reverse(ary)
result = []
for result[0,0] in ary
end
result
end
assert_equal ["baz", "bar", "foo"], reverse(["foo", "bar", "baz"])
这有效,我想了解原因。有什么解释吗?
如果我使用each
而不是重写for/in
它,它看起来像这样:
def reverse(ary)
result = []
# for result[0,0] in ary
ary.each do |item|
result[0, 0] = item
end
result
end
for a in b
基本上说,取出数组中的每个项目b
并将其分配给 expression a
。因此,当它不是一个简单的变量时,就会发生一些魔术。
该array[index, length] = something
语法允许替换多个项目,甚至是 0 个项目。所以ary[0,0] = item
说在索引零处插入item
,替换零项。这基本上是一个unshift
操作。
但实际上,只需使用each
带有块的方法即可。一个没有改变状态的主体的 for 循环必须是最迟钝和难以阅读的东西之一,乍一看它并没有达到你的预期。 each
提供更少的疯狂惊喜。
您将 ary 中的值放在结果的第一个位置。所以假设我们有数组:
a = ["baz", "bar", "foo"]
所以a[0,0] = 5
将a
等于[5, "baz", "bar", "foo"]
由于您遍历整个数组,因此您将每个元素插入结果数组的开头,同时移动现有元素,从而反转原始元素。