Ruby:此代码中的call是Proc调用还是自定义方法?
解惑:BaseCommand中的
call是自定义方法,而非Proc调用 先把你提到的完整核心代码贴出来,方便对照:
class BaseCommand attr_reader :result def self.call(*args) new(*args).call end def call @result = nil payload self end # 其他省略代码... end
核心结论
这里的两个call都是自定义方法,和Proc的call没有任何关系:
- 第一个
def self.call(*args)是类方法,作用是帮你简化调用流程——你只需要写BaseCommand.call(参数),它内部会自动创建类的实例,然后调用该实例的call方法。 - 第二个
def call是实例方法,是真正执行命令逻辑的地方(这里初始化了@result,调用payload方法,最后返回实例本身)。
为什么会混淆?
Ruby里确实有Proc对象的call方法(比如proc { puts "hello" }.call),但这里的上下文完全不同:
- 类方法
self.call是直接定义在BaseCommand这个类上的,属于类的方法集合; - 实例方法
call是每个BaseCommand实例都会拥有的方法; - 两者都是开发者自定义的,和Proc的内置
call没有关联。
这种写法的意义
这是Ruby里常见的命令模式实现:
- 对外提供简洁的调用入口(类方法
call),外部代码不需要关心实例化的细节; - 把具体逻辑封装在实例方法里,方便后续子类继承重写
call或者payload方法,实现命令的扩展。
内容的提问来源于stack exchange,提问作者MLZ
相关产品推荐
相关产品推荐

