Dogクラスでは、selfは 'Dog'クラスです(すべてのクラスには 'class'オブジェクトがあり、メタクラスまたはeigenclassと呼ばれることもあります)。
rubyのすべてのメソッドは、インスタンスメソッドです。
def self.species
は、「クラスクラス」で種別メソッドを宣言しています(クラスメソッドと同じように動作します)。同様
、
d = Dog.new
def d.bark; puts "woof"; end
は
class << self
def species
と
def self.species
それらが機能的に目を達成するとの間の差については 'D' インスタンス
にメソッドを追加します同じこと。もう1つのフォーマットを選択すると、他のタイプのフォーマットと同じように、書式が選択されます。 def self.speciesは、 'class'メソッドを宣言するための通常のものです。
私はむしろインスタンスよりも、クラスレベルで動作する属性のアクセサを作りたいとしたら、私はほとんど
class << self
attr_accessor :species
end
を使用します。樹皮方法:これはモジュールのようなフックを使用することが重要である理解
はまた
module Sound
def self.included(host_class)
def host_class.speak(sound)
define_method(:bark) do
sound
end
end
end
end
class Dog
include Sound
speak "woof"
end
Dog.new.bark
を含め、完全
class Dog
def self.species
puts self.to_s
end
def Dog.bark
puts self.to_s
end
end
class Spaniel < Dog; end
のための種の方法は、一方で、任意のサブクラスの自己上で定義されています(上書きされない限り)常に犬に定義されます
出典
2012-04-16 12:43:38
BF4
'Dog.species'は後でクラス名を変更すると問題があります。 'self.species'を使いましょう。 –