ruby:块中的执行顺序

时间:2012-11-07 04:53:14

标签: ruby

我理解这个skip_tracks方法中发生了什么,但是,我从来没有用这种方式编写它,因为我不理解块中行为的基本规则。这是令我困惑的部分

 skip.times { playlist.push playlist.shift}

是否存在从右到左执行的规则,以便将返回的值返回并推送到播放列表?如何知道将被转移到播放列表中的价值?为了使这成为一个规则,块内发生了什么?你能解释一下吗...另外,如果这个块已被多行写入,playlist.push会高于playlist.shift,因此首先执行,但是此代码要求在推送之前移动该值


def skip_tracks(playlist, skip)
  if skip > 0
    skip.times { playlist.push playlist.shift}
  else
    skip.abs.times { playlist.unshift playlist.pop }
  end
  puts playlist
end


playlist = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']
skip_tracks(playlist, 2)

1 个答案:

答案 0 :(得分:1)

pushunshift视为接受参数的函数,并将传递给它的元素放入列表中;以及shiftpop作为删除和返回元素的函数。

如果我使用类似c的函数语法编写正在发生的事情,你会得到:

playlist.push(playlist.shift())

playlist.unshift(playlist.pop())

因此,它将从内到外解决这些函数调用,并获得您看到的行为。