在Enumerable的每个块中是否有特殊变量表示数组本身?

时间:2014-11-19 13:51:36

标签: ruby

我有这样的代码:

array = [100, 90, 120, 100, 110]
array.each_with_index.map do |v, i|
    next if i == array.size - 1
    array[i+1] - v
end

我认为如果我能这样写的话会更好:

array = [100, 90, 120, 100, 110]
array.each_with_index.map do |v, i|
    next if i == _.size - 1
    _[i+1] - v
end

所以我想知道在Enumerator块中是否有一个表示数组本身的特殊变量。

有人知道吗?

2 个答案:

答案 0 :(得分:4)

我认为您正在寻找的是使用each_cons,它为每个连续元素数组迭代给定的块:

 array.each_cons(2).map { |a, b| a - b }
 # => [10, -30, 20, -10]

答案 1 :(得分:0)

Ruby具有块范围,这意味着,您在do/end块中定义的任何新变量将仅在该范围内,并且在其他任何位置都不可访问。在IRB中,_ has a special meaning,这是执行的最后一个表达式的值。但是,在执行Ruby程序时并非如此。你可以做的是在块本身内部定义一个临时_变量,它将保存对数组的引用:

arr = [1,2,3]
arr.each do |x|
  _ = arr
  p _ #=> will print [1,2,3] 3 times
end

p _ #=> undefined local variable

除此之外,我考虑使用猴子修补Array,但这是一项危险的操作。但是,大多数时候会出现类似这样的问题,如果你能更好地了解自己想要实现的目标,那么解决方案比这些问题更简单。