首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >self.generate和Invoice.generate有什么不同?

self.generate和Invoice.generate有什么不同?
EN

Stack Overflow用户
提问于 2012-11-19 13:25:46
回答 3查看 92关注 0票数 2
代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-19 13:37:27

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

解释

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

代码语言:javascript
复制
def receiver.method(args) 
end

看看这个

代码语言:javascript
复制
class Foo
end

def Foo.bar
  "bar"
end

Foo.bar # => "bar"

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

代码语言:javascript
复制
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指向该类。

代码语言:javascript
复制
class Foo
  # self is Foo
end

因此,有了这些知识,self.generateInvoice.generate之间的区别应该是显而易见的。

票数 5
EN

Stack Overflow用户

发布于 2012-11-19 13:57:34

在正常情况下,它实际上与def self.generate没有区别。

我能想到的唯一的边缘情况是,如果您有一个同名为的嵌套类,那么显式版本将只应用于嵌套类。

代码语言:javascript
复制
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进行的隐式定义总是引用基类。

票数 1
EN

Stack Overflow用户

发布于 2012-11-19 13:42:41

定义类方法有两种方法。

1)您可以直接使用类的名称

代码语言:javascript
复制
class Test #Test is now an instance of a built-in class named Class
  def Test.class_method
    "I'm a class method."
  end
end

2)您可以使用变量,该变量始终指向当前对象的self

代码语言:javascript
复制
class Test
  def self.class_method
    "I'm a class method."
  end
end

一旦您理解了类是对象,使用self变量来定义类方法终于有意义了。

self的值

令人惊讶的是,当您在class方法中时,self的值是指包含类结构的对象( class的实例)。这意味着:

代码语言:javascript
复制
class Test
  def self.class_method
    self.x
  end
end

等同于:

代码语言:javascript
复制
class Test
  def self.class_method
    Test.x
  end
end

当您在实例方法中时,self的值仍然引用当前对象。但是,这一次,当前对象是类Test的实例,而不是类Class的实例。

更多信息。http://www.jimmycuadra.com/posts/self-in-ruby

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13448154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档