2016-04-06 4 views
2

ここにはworkflow 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 

(クラスメソッド)と同等の

 class << self 
     return workflow_spec if workflow_spec 
     end 

です:

 class << self 
     def workflow_spec 
     return workflow_spec if workflow_spec 
     end 
    end 

workflow_specがクラスメソッドである場合、それをmethodの内部で定義する目的は何ですか? と呼ばれるworkflow_specはありますか?またはちょうどself.workflow_spec

答えて

1

は上記の例ではと定義されていません。 クラスメソッドworkflow_specへの呼び出しがあり、それがtruthyを返した場合はそれを呼び出します。

さらに、この動作はのコメントに記載されています。 workflowのコードと上記のコードの差がworkflow GEMは一般的ではない、eigenclassを呼び出すことである

return self.class.workflow_spec if self.class.workflow_spec 

コード

class << self 
    return workflow_spec if workflow_spec 
    end 

は、[ほぼ]のと等価ですクラス。

、完全に同等では次のようになります。

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

または(@Jordanにクレジット):これは、クラスメソッドの存在をチェックしません

return singleton_class.workflow_spec if singleton_class.workflow_spec 
+1

。シングルトンクラスの 'workflow_spec'メソッドをコール*し、その戻り値が真実であれば、それを再度呼び出し、それによって返された値を返します。 –

+2

'workflow_spec'が' if self.class.methods.include? 'とどのように似ているのかわかりません。 workflow_spec'である。これは実際に*メソッドを2回呼び出さないでしょうか? (つまり、self.class.workflow.spec()ならreturn self.class.workflow_spec() ') – Amadan

+0

@Jordan、Amadan確かにもう一杯のコーヒーが必要です。私の上の恥、固定。 – mudasobwa

関連する問題