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
中的每一项并将其分配给表达式 a
。所以当它不是一个简单的变量时会发生一些神奇的事情。
array[index, length] = something
语法允许替换多个项目,甚至是 0 个项目。所以 ary[0,0] = item
表示在索引零处插入 item
,替换零项。它基本上是一个 unshift
操作。
但实际上,只需将 each
方法与 block 一起使用即可。没有改变状态的主体的 for 循环必须是最迟钝和难以阅读的东西之一,乍一看它不会做你期望的事情。 each
提供的疯狂惊喜要少得多。
关于ruby - 奇怪的 ruby for 循环行为(为什么这样做有效),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14615937/