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为什么要在Invoice类中创建Invoice.generate而不是self.generate
发布于 2012-11-19 13:37:27
self.generate更容易使用,而Invoice.generate可以说更明确。除此之外,两者之间没有区别。
解释
您可以使用此表单在任何实例上定义方法
def receiver.method(args)
end看看这个
class Foo
end
def Foo.bar
"bar"
end
Foo.bar # => "bar"是的,我的意思是any实例。绝对有可能一个实例有一些方法,而另一个实例没有
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)需要提醒的是:在类定义内(但在方法定义外),self指向该类。
class Foo
# self is Foo
end因此,有了这些知识,self.generate和Invoice.generate之间的区别应该是显而易见的。
发布于 2012-11-19 13:57:34
在正常情况下,它实际上与def self.generate没有区别。
我能想到的唯一的边缘情况是,如果您有一个同名为的嵌套类,那么显式版本将只应用于嵌套类。
class A
def self.x
name
end
def A.y
name
end
class A
# nested class A::A
end
def self.p
name
end
def A.q
name
end
end
> A.x # => "A"
> A.y # => "A"
> A.p # => "A"
> A.q # => NoMethodError: undefined method `q' for A:Class
> A::A.q # => "A::A"正如您所看到的,在定义了具有相同名称的嵌套类之后,使用该类名进行的后续显式类方法定义将引用该嵌套类,但预先进行的显式定义将引用原始类。
使用self进行的隐式定义总是引用基类。
发布于 2012-11-19 13:42:41
定义类方法有两种方法。
1)您可以直接使用类的名称
class Test #Test is now an instance of a built-in class named Class
def Test.class_method
"I'm a class method."
end
end2)您可以使用变量,该变量始终指向当前对象的self
class Test
def self.class_method
"I'm a class method."
end
end一旦您理解了类是对象,使用self变量来定义类方法终于有意义了。
self的值
令人惊讶的是,当您在class方法中时,self的值是指包含类结构的对象( class的实例)。这意味着:
class Test
def self.class_method
self.x
end
end等同于:
class Test
def self.class_method
Test.x
end
end当您在实例方法中时,self的值仍然引用当前对象。但是,这一次,当前对象是类Test的实例,而不是类Class的实例。
更多信息。:http://www.jimmycuadra.com/posts/self-in-ruby
https://stackoverflow.com/questions/13448154
复制相似问题