在我试图关注的一本书中,有一节让我完全陷入困境。 (这本书是实用的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.这就是说我在整个代码块上都很模糊。
答案 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}}。)