Ruby 调用循环内部的调用

Ruby 调用循环内部的调用,ruby,Ruby,在我试图阅读的一本书中,有一部分让我完全不知所措。(本书是实用Ruby项目->创建基于回合的游戏) 所以我的问题是关于@action.call(…)似乎@action正在从call内部调用call。这不会产生某种无限循环吗 在我看来,Choice.new没有足够的参数。初始化似乎只需要2,但Choice.new似乎超过了3。也就是说,我对这整段代码的理解非常模糊。参数 由于rep前面的原因,选项的构造函数似乎接受任意数量的参数。这就是说,参数列表是“Move”,x,y和@rep中的初始化成为以下

在我试图阅读的一本书中,有一部分让我完全不知所措。(本书是实用Ruby项目->创建基于回合的游戏)

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

在我看来,Choice.new没有足够的参数。初始化似乎只需要2,但Choice.new似乎超过了3。也就是说,我对这整段代码的理解非常模糊。

参数 由于
rep
前面的原因,
选项的构造函数似乎接受任意数量的参数。这就是说,参数列表是
“Move”,x,y
@rep
中的
初始化
成为以下各项的数组:

@rep = ["Move", x, y]
代码块 传递给构造函数的代码块不是普通参数。它由前导符号(
&
)表示,不作为参数,它是一种特殊情况。因此,
@操作
似乎分配给:

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

谢谢。参数部分更有意义。我想我把代码块存储为变量。不过,请继续提问。变量如何调用方法?”@非“类选择”的“操作”调用方法“调用”
@action
调用存储在
@action
中的
Proc
对象上的方法。它与选择呼叫无关,这些只是谐音。我猜你可能被分配给不同事物的相同名称弄糊涂了。更准确地说:那里发生的事情实际上像
(Proc.new{unit.move(x,y)})。call()
@DChaps,当你问“一个变量如何调用一个方法?”时,你会感到困惑。方法不被变量或任何其他对象调用。你,程序员,向接收者发送方法。在第一个实例中,您将带有参数的
call
发送到
choice
。Ruby看到
choice
choice
的一个实例,它告诉它您正在发送的是类的实例方法
调用。当执行该方法时,您将带参数的
调用
发送给接收方
@action
。由于
@action
是类
Proc
的实例,Ruby将该方法标识为
Proc\call
@rep = ["Move", x, y]
@action = lambda { unit.move(x, y) }