在呼叫循环内部调用

时间:2014-12-26 07:36:47

标签: ruby

在我试图关注的一本书中,有一节让我完全陷入困境。 (这本书是实用的Ruby项目 - >创建一个回合制游戏)

class Choice
     def initialize(*rep, &action)
           @rep, @action = rep, action
     end

     def call(*args, &proc)
         @action.call(*args, &proc)
     end
end

choice = Choice.new("Move", x, y) {unit.move(x, y)}

所以我的问题是关于@action.call(...)看来@action正在call内部调用call。这不会产生某种无限循环吗?

在我看来,Choice.new还没有足够的参数。初始化似乎只需要2,但Choice.new似乎正在通过3.这就是说我在整个代码块上都很模糊。

1 个答案:

答案 0 :(得分:0)

参数

Choice的构造函数似乎接受任意数量的参数,因为rep前面有splat operator。也就是说,"Move", x, y中的参数列表为@rep,而initialize中的@rep = ["Move", x, y] 成为其中的数组:

&

码块

传递给构造函数的代码块不是普通参数。它由前导符号(@action)表示,不计入参数,这是一种特殊情况。因此,@action = lambda { unit.move(x, y) } 似乎已分配给lambda

call

拨打

Choice @action方法简单地“重定向”对存储在Choice#call中的lambda的调用。也就是说,对@action的任何调用都将调用lambda,存储在unit.move实例变量中。在这种特殊情况下,将使用参数@rep[1]@rep[2]调用@rep(根据构造函数中初始化的{{1}}。)