奇怪的红宝石循环行为(为什么这样做)

时间:2013-01-30 23:39:14

标签: ruby for-loop

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

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

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

2 个答案:

答案 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"]

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