def reverse(ary)
result = []
for result[0,0] in ary
end
result
end
assert_equal ["baz", "bar", "foo"], reverse(["foo", "bar", "baz"])
这有效,我想了解原因。有什么解释吗?
答案 0 :(得分:10)
如果我使用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
中的每个项目并将其分配给表达式a
。因此,当它不是一个简单的变量时会发生一些魔法。
array[index, length] = something
语法允许替换多个项目,甚至是0个项目。因此,ary[0,0] = item
表示在索引零处插入item
,替换零项。它基本上是unshift
操作。
但实际上,只需将each
方法与块一起使用即可。没有身体改变状态的for循环必须是最愚蠢和难以阅读的东西之一,它没有做你乍看之下的预期。 each
提供了更少的疯狂惊喜。
答案 1 :(得分:4)
您将值放在结果的第一个位置。所以我们说我们有阵列:
a = ["baz", "bar", "foo"]
因此a[0,0] = 5
会使a
等于[5, "baz", "bar", "foo"]
由于遍历整个数组,因此在移动现有元素时将每个元素插入到结果数组的开头,从而反转原始元素。