Ruby 一个类方法在另一个方法中?

Ruby 一个类方法在另一个方法中?,ruby,Ruby,这里是工作流gem中的方法定义 def spec # check the singleton class first class << self return workflow_spec if workflow_spec end c = self.class # using a simple loop instead of class_inheritable_accessor to avoid

这里是
工作流
gem中的方法定义

   def spec
      # check the singleton class first
      class << self
        return workflow_spec if workflow_spec
      end

      c = self.class
      # using a simple loop instead of class_inheritable_accessor to avoid
      # dependency on Rails' ActiveSupport
      until c.workflow_spec || !(c.include? Workflow)
        c = c.superclass
      end
      c.workflow_spec
    end
def规范
#首先检查singleton类
类上述示例中未定义任何内容。有一个对class方法
workflow\u spec
的调用,如果它返回
truthy
,则随后会调用它

此外;这种行为在你发布的剪报中的评论中有描述

代码

  class << self
    return workflow_spec if workflow_spec
  end
workflow
中的代码与上面代码的区别在于
workflow
gem调用的是一个,而不是一个普通类

确切的等价物是:

eigenclass = class << self; self; end
return eigenclass.workflow_spec if eigenclass.workflow_spec

它不会检查类方法是否存在。它调用singleton类上的
workflow_spec
方法,如果其返回值为truthy,则再次调用该方法并返回其返回的值。我看不出
如果workflow_spec
if self.class.methods.include如何等效?工作流规范
。这不会实际调用该方法两次吗?(即
返回self.class.workflow\u spec()如果self.class.workflow.spec()
)@Jordan,Amadan确实,我还需要一杯咖啡。我真丢脸,修正了。@Amadan用
self.singleton\u class
替换
self.class
,你完全正确。@Jordan:对,谢谢,我只是盲目地复制粘贴。
  class << self
    return workflow_spec if workflow_spec
  end
  return self.class.workflow_spec if self.class.workflow_spec
eigenclass = class << self; self; end
return eigenclass.workflow_spec if eigenclass.workflow_spec
return singleton_class.workflow_spec if singleton_class.workflow_spec