2
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.generate内で作成するのはなぜですか?Invoiceself.generate

4

3 に答える 3

5

self.generateの方が作業が簡単ですが、Invoice.generate間違いなくより明示的です。それ以外は、両者に違いはありません。

説明

このフォームを使用して、任意のインスタンスでメソッドを定義できます

def receiver.method(args) 
end

これをチェックしてください

class Foo
end

def Foo.bar
  "bar"
end

Foo.bar # => "bar"

そして、はい、私はあらゆる例を意味します。あるインスタンスにはメソッドがあり、別のインスタンスにはメソッドがないということは絶対にありえます

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-19T05:37:26.700 に答える
1

通常の状況下では、実質的に との違いはありません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-19T05:57:34.280 に答える
0

クラス メソッドを定義するには 2 つの方法があります。

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
end

2)常に現在のオブジェクトを指している自己変数を使用できます

class Test
  def self.class_method
    "I'm a class method."
  end
end

クラスがオブジェクトであることを理解すれば、self 変数を使用してクラス メソッドを定義することは最終的に理にかなっています。

自己の価値

当然のことながら、クラス メソッド内にいる場合、self の値は、クラス構造を保持するオブジェクト (クラス Class のインスタンス) を参照します。この意味は :

class Test
  def self.class_method
    self.x
  end
end

と同等です:

class Test
  def self.class_method
    Test.x
  end
end

インスタンス メソッド内にいる場合でも、self の値は現在のオブジェクトを参照します。ただし今回は、現在のオブジェクトはクラス Class のインスタンスではなく、クラス Test のインスタンスです。

より詳しい情報。: http://www.jimmycuadra.com/posts/self-in-ruby

于 2012-11-19T05:42:41.043 に答える