Rubyのオブジェクト指向プログラミング学習雑記


クラスを開く
既に存在しているクラスを再开して動的に修正することができ、StringやArayのような標準ライブラリのクラスも例外ではない。このような行為はオープンクラスといいます。
サルパッチ
もしあなたがうかつに、ある種類に新しい機能を追加して、元の機能をカバーして、他の部分のコードに影響を与えるというpatchを猿パッチといいます。
クラスとモジュール
Rubyのクラスのキーワードは、タイプのステートメント文ではなく、ドメインオペレータの役割のようです。クラスのキーワードの核心任務はクラスの文脈に持ってきて、中で方法を定義することができます。
各クラスは一つのモジュールです。クラスは三つの方法(new、allocate、superclass)を持つ強化モジュールです。この三つの方法でクラスの継承構造を組織し、オブジェクトを作成します。
Rubyの中のクラスとモジュールの概念は非常に近くて、完全に両者を相互に代えることができます。両者の原因はコードの明確性を維持するために、コード意図をより明確にするためです。使用原則:
  • は、自分のコードを他のコードに含めることを希望しています。モジュール
  • を使用するべきです。
  • 特定のコードが実装されたり、継承されたりしたい場合は、クラス
  • を使用する必要があります。
  • モジュール機構は、他の言語と同様の名前空間概念
  • を実現するために使用されてもよい。
    Rubyの中の:記号
    Rubyの定数のパス(作用領域)は、ファイルシステムのディレクトリと似ています。
    相手は何ですか
    オブジェクトはインスタンス変数のセットに加えて、クラスへの参照を指します。対象の方法は対象自体ではなく、対象のクラスに存在します。
    何がクラスですか
    クラスとは、オブジェクト(クラスクラスの一例)のセットにインスタンス方法とスーパークラスへの参照を加えることです。クラスはModuleクラスのサブクラスですので、一つのクラスもモジュールです。
    ロードとrequire方法の違い
    ロードとrequireを通じて他の人のコードを導入することができますが、異なるのはロード方法でコードをロードするために使用されます。現在の名前空間を汚染したくないなら、ロードを通じて(file.rb',true)明示的な要求を行います。file.rbの定数を引き継ぎ、requireはクラスライブラリを導入するために使用します。ロード回数についてロード方法は呼び出しごとにロードされたファイルを再実行します。requireは各ライブラリファイルに一回だけロードします。
    prepend、includeと祖先チェーン
    祖先チェーンはRubyオブジェクトの継承関係を記述するために用いられ、クラスとモジュールは親子関係であるため、祖先チェーンにはモジュールが含まれてもよく、prependとincludeはそれぞれチェーンにモジュールを追加することができ、異なるのはinclude方法を呼び出すと、モジュールは祖先チェーンに挿入され、現在のクラスの真上に、prependは同様に祖先チェーンに挿入されます。しかし、他の位置は現在のクラスの真下にあります。また、Class.ancestorsを通じて現在の祖先チェーンを見ることができます。
    prvateルール
    プライベートメソッドは、受信者を明確に指定することによって呼び出すことができません。プライベート方法は、暗黙的な受信者selfでのみ呼び出すことができます(Object嗳sendは例外です)
    self関連
    一つの方法を呼び出すと、受信者はself役を演じます。受信者を明確に指定していない方法で呼び出します。selfを呼び出す方法としてモジュール(またはクラス)を定義する場合、このモジュール(またはクラス)はself役を演じます。
    オブジェクト、クラスとモジュールの関係
    2016519152625751.jpg (640×462)
    上のModule.classもクラスを指しています。上のブロックの内容は全部クラスと理解できますが、彼らの親子の組織関係はsuperclassを通じて設立され、異同があります。クラス.ancestorsを通じて調べられます。
    ダイナミックな方法
    動的呼び出し方法
    Rubryでは、ポイントの代わりに、Objectと呼ばれるオブジェクトを識別するための指定の例示的な方法があります。
    サンプルコード
     
    
    class MyClass
      def my_method(my_arg)
        my_arg * 2
      end
    end
    
    obj = MyClass.new
    obj.my_method(3)  #=> 6
    obj.send(:my_method, 3) #=> 6
    
    
    上のコードは直接的な呼び出しとsendメソッドを使用して呼び出された結果は同じであり、sendを使用する利点は、符号化において動的な決定方法を呼び出すことができることである。この技術は元のプログラミングの中で動的配布と呼ばれています。
    また指摘すべき点はObject铅sendを通じて共通方法を呼び出すことができるだけでなく、オブジェクトのプライベート方法を呼び出すこともできることである。対象のパッケージの特性を残したいなら、プライベートを外に露出しない方法でObject菵publicを使うことができます。sendの方法。
    動的定義方法
    方法の動的呼び出しに加えて、RubyはModule_define uuを通じてmethod方法とコードブロックは、動的方法定義方式を提供する。
    サンプルコード
    
    class MyClass
      define_method :my_method do |my_arg|
        my_arg * 3
      do
    end
    
    obj = MyClass.new
    obj.my_method(2) #=> 6
    
    
    上のコードはdefine(u)を通ります。method方法はキーワードdefに取って代わりました。本質的には同じです。定義方式だけで、define_methodの方式はより柔軟であり、符号化における関数の定義を導出することによって実現の柔軟性を高めることができる。
    method_missingの方法
    厳密にはmethodをmissing方法は、明確な定義ではなく(methodsリストには現れない)、その本質は、方法によって検索されたメカニズムによって、呼び出し情報を取得し、適切な方法で応答することである。異常処理中の投げ出し異常と似ています。
    method_missingは、オブジェクトがある方法で呼び出されたときに、その対応するクラスの例示的な方法で検索され、見つけられなかったら、BaicObjectクラスが見つかるまで、祖先チェーンに沿って上に検索する仕組みを利用している。全部ないなら、最終的にBaicObjectを呼び出します。missingがNoMethodErrを投げると異常です。
    私たちは似たような方法をたくさん定義する必要があります。missing方法は、似たような方法を統一して回答することで、定義された方法を呼び出すのと同じように行動する。
    サンプルコード
    
    class Roulette
     def method_missing(name, *args)
      person = name.to_s.capitalize
      super unless %w[Bob Frank Bill Honda Eric].include? person
      number = 0
      3.times do
       number = rand(10) + 1
       puts "#{number}..."
      end
      "#{person} got a #{number}"
     end
    end
    
    number_of = Roulette.new
    puts number_of.bob
    puts number_of.kitty
    
    
    ダイナミックエージェント
    いくつかのパッケージ化されたオブジェクトに対して、method_missing方法は呼び出しを収集し、これらの呼び出しをパッケージ化されたオブジェクトに転送するプロセスを動的エージェントと呼び、ここでmethod_missingは動的を体現していて、転送は代理を体現しています。
    constmissingの方法
    methodとmissingに似ています。常量に関するconst_もあります。missing方法は、存在しない定数を引用すると、Rubyはこの定数名をシンボルとしてconst(u)に伝達する。missing方法
    ホワイトボード類(blank slates)
    いくつかの方法を持っている種類を白板類と呼び、BaicObject類を継承することで、白板類を迅速に入手することができます。この方法以外にも、削除方法によって、普通のクラスをホワイトボードに変えることができます。
    削除方法
    ある方法を削除するには、2つの方法があります。
  • Module〹undef_method
  • Module{remove umethod
  • 両者の違いはModule噫undef_である。methodは(引き継ぎを含む)すべての方法を削除します。Module嚓レモブmethodは受信者の自分の方法だけを削除して、継承してくる方法を保留します。
    ダイナミックな方法とMethod_missingの使用原則
    ダイナミックな方法が使えるときは、できるだけダイナミックな方法を使います。method_を使わなければなりません。missing方法(特に方法が多い場合)は、なるべく使わないようにします。