Rubyのクラスメソッド

少し前まで、ルビーを勉強しているときに、クラスメソッドとは何なのか、より正確には、インスタンスとの違いは何か、なぜ必要なのかがわからないという事実に出会いました。 私が現在勉強している教科書では、このトピックは十分に詳細に説明されていなかったか、詳細な説明まで読んでいませんでしたが、いずれにしても、私はそれを理解することに興味があり、Googleで答えを探すようになりました。 この投稿は、私が見つけて理解したことのすべてです。 もちろん、ここでは経験豊富なルビー開発者にとってあまり興味深いものはありませんが、私と同じ言語の新人を支援できることを願っています。 興味をそそられたら、猫をお願いします。



はじめに、すべてのオブジェクトをrubyで定義しましょう。 それは吸収され、獲得され、常に記憶されなければなりません。 クラスでさえ、名前が定数であるオブジェクトです。 また、各オブジェクトでは、メソッドのおかげで任意のアクションを実行できます。 したがって、合理的な質問が発生します:メソッドのおかげでクラスで何かをすることは可能ですか?



私は多くの人がこの質問に対する答えが肯定的であると推測すると思います、私はさらに言います:ルビーでは、各メソッドはインスタンスメソッドまたはクラスメソッド(それぞれクラスメソッド)です。 作成のメソッドを除いて、最初のメソッドがクラスのインスタンスで呼び出され、2番目のメソッドがクラスで呼び出されるという点でのみ異なります。 2つの方法の違いを理解し、いつどの方法を使用するかを決定できることが重要です。 したがって、クラスメソッド(クラスの適合性)を検討しますが、最初に、インスタンスメソッドが何であるかを説明することもあります。



インスタンスメソッド(インスタンスメソッド):


多くの場合、通常このような方法で使用され、ほとんどすべての教科書で言語学習が始まります。 通常、これらは3つの方法で作成されます。



#  1 class Test def foo puts ' ' end end a = Test.new a.foo # => " " #  2 class Test attr_accessor :foo end a = Test.new a.foo = ' ' puts a.foo #  3 class Test; end a = Test.new def a.foo puts ' ' end Test.new.foo # => " "
      
      







複雑なことはなく、すべてが明確です。 それらはどこでも、どこでも使用されます。 たとえば、レールでは、インスタンスモジュールが同じ投稿の作成と削除を担当する場合があります。また、一般的な方法は追加方法です。



クラスメソッド


Rubyは非常に柔軟で簡潔な言語であるため、クラスメソッドを作成するための4つの異なる方法を提供します。



 #  1 class Test def self.foo puts ' ' end end Test.foo # => " " #  1 class Test def Test.foo puts ' ' end end Test.foo # => " " #  3 class Test class << self def foo puts ' ' end end end Test.foo # => " " #  4 class Test; end def Test.foo puts ' ' end Test.bar # => " "
      
      







実際、これらのメソッドの作成も難しくありません。 提示されたすべてのメソッドは同じように機能し、それらを区別する唯一のことは開発者の好みです。 最初のメソッドと2番目のメソッドは同じ構成を使用しますが、変数self



のみが異なります。 3番目のケースは、匿名クラスが作成されるという点で興味深いものであり、最後のケースはシングルトンの作成に非常に似ています。 self.name_class_method



に似たコードを見ると、それがクラスメソッドであることを理解しているため、最初のケースでは混乱が少ないため、コードが読みやすいと主張する人々の意見に同意します。



これらの方法を使用する価値があるのはいつですか? 通常、クラスの個々のインスタンスを処理していないときに使用されます。 最も一般的な例は、レールでの検証方法です。 コードは次のようになります。



 module ActiveRecord class Base def self.validates_of(...) #   end end end class Foo < ActiveRecord::Base validates_of :bar #       end
      
      







この例には、 arrt_*



ファミリーのすべてのメソッドも含まれています。 Class



クラスのすべてのインスタンスを含む素晴らしいnew



メソッドもあります。



インスタンスメソッドとクラスメソッド間の相互作用。


クラスメソッドでインスタンスメソッドを呼び出す必要がある場合がありますが、rubyはこのためのエレガントな方法を提供します。



 #  instance   class . class Test def instance_method #   end def self.class_method a = Test.new a.instance_method end end
      
      







また、逆に、インスタンスメソッドでクラスメソッドを呼び出す必要がある場合があります。 これらの目的のために、 class



メソッドを使用する必要があります。



 #  class   instance . class Test def self.class_method puts self end def instance_method self.class.class_method end end
      
      







self



は特定のクラスの値を返すため、そのようなクラスの相続人が親メソッドを返す必要があるときに混乱が発生する場合があることを理解することが重要です。 これらの目的のために、 self



代わりに、親のクラス名を直接使用します:



 class Test1 def self.class_method "foo" end def make1 self.class.class_method end def make2 Test1.class_method end end class Test2 < Test1 def self.class_method "abc" end end b = Test2.new b.make1 # => "abc" b.make2 # => "foo"
      
      







PS:最後の例でエラーを見つける手助けをしてくれた仲間のwalkman7に感謝します。



All Articles