self.generate和Invoice.generate有什么区别?

Jac*_*han 2 ruby oop

class Invoice
  def Invoice.generate(order_id, charge_amount, credited_amount = 0.0)
    Invoice.new(:order_id => order_id, :amount => charge_amount, :invoice_type => PURCHASE, :credited_amount => credited_amount)
  end
end
Run Code Online (Sandbox Code Playgroud)

你为什么要创建Invoice.generate内部Invoice课而不是self.generate

Ser*_*sev 5

self.generate更容易使用,而Invoice.generate可以说更明确.除此之外,两者之间没有区别.

说明

您可以使用此表单在任何实例上定义方法

def receiver.method(args) 
end
Run Code Online (Sandbox Code Playgroud)

看一下这个

class Foo
end

def Foo.bar
  "bar"
end

Foo.bar # => "bar"
Run Code Online (Sandbox Code Playgroud)

是的,我的意思是任何实例.绝对有可能一个实例有一些方法,而另一个实例没有

f = Foo.new

def f.quux
  'quux'
end

f2 = Foo.new

f.quux # => "quux"
f2.quux # => # ~> -:20:in `<main>': undefined method `quux' for #<Foo:0x007fe4e904a6c0> (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

提醒:类定义内部(但在方法定义之外)self指向该类.

class Foo
  # self is Foo
end
Run Code Online (Sandbox Code Playgroud)

所以,有了这些知识,之间的区别self.generate,并Invoice.generate应该是显而易见的.