0

我理解这个 skip_tracks 方法中发生了什么,但是,我永远不可能这样写,因为我不理解块中行为背后的规则。这是让我困惑的部分

 skip.times { playlist.push playlist.shift}

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


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)
4

1 回答 1

1

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

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

playlist.push(playlist.shift())

playlist.unshift(playlist.pop())

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

于 2012-11-07T04:59:20.817 回答