5
def reverse(ary)
  result = []
  for result[0,0] in ary
  end
  result
end

assert_equal ["baz", "bar", "foo"], reverse(["foo", "bar", "baz"])

这有效,我想了解原因。有什么解释吗?

4

2 回答 2

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并将其分配给 expression a。因此,当它不是一个简单的变量时,就会发生一些魔术。

array[index, length] = something语法允许替换多个项目,甚至是 0 个项目。所以ary[0,0] = item说在索引零处插入item,替换零项。这基本上是一个unshift操作。


但实际上,只需使用each带有块的方法即可。一个没有改变状态的主体的 for 循环必须是最迟钝和难以阅读的东西之一,乍一看它并没有达到你的预期。 each提供更少的疯狂惊喜。

于 2013-01-30T23:51:36.237 回答
4

您将 ary 中的值放在结果的第一个位置。所以假设我们有数组: a = ["baz", "bar", "foo"]

所以a[0,0] = 5a等于[5, "baz", "bar", "foo"]

由于您遍历整个数组,因此您将每个元素插入结果数组的开头,同时移动现有元素,从而反转原始元素。

于 2013-01-30T23:51:59.523 回答