一緒にRubyを征服します! エイスドロップ

今すぐ4つ目のドロップを読み直して、RubyでのPLOの実装を思い出しましょう。 繰り返しますか? どうぞ このドロップでは、Rubyのオブジェクト指向プログラミングに関連する結果のテールをすべてトリミングします。





新規および初期化



4番目のドロップからコードをもう一度見てみましょう。



 class Dog def set_name( aName ) @myname = aName end def get_name return @myname end def gav return 'rrrr!' end end dog1 = Dog.new dog1.set_name( 'Fido' ) puts(dog1.get_name) puts(dog1.gav)
      
      







同様のプログラム:



 class Dog def initialize(name, age) @name = name @age = age end def get_name return @name end def get_age return @age end end d = Dog.new('Fido', 2) puts "My name is #{d.get_name} and I'm #{d.get_age}"
      
      







新しいクラスが定義されると(通常はclass Name ... end



を使用)、タイプClass



オブジェクトClass



ます。 新しいオブジェクトを作成するためにName.new



Name.new



と、 Class



からnew



インスタンスメソッドが呼び出され、新しいオブジェクトのinitialize



メソッドが呼び出される前に、 allocate



をアクティブallocate



してオブジェクトにメモリを割り当てます。 オブジェクトの構築と初期化のフェーズは別々であり、書き換えることができます。 初期化は、インスタンスのinitialize



メソッドを介して行われ、構築はnew



介して行われます。 initialize



initialize



はありません(もちろん議論の余地がありますが、ソースが異なれば意見も異なります)。



initialize



を使用すると、 set_name



などのメソッドを使用してインスタンス変数を設定initialize



も2つの明確な利点があります。 まず、複雑なクラスには多くのインスタンス変数を含めることができ、それらのすべてを、メソッドを記述することなく、 initialize



を含む単一行を使用して宣言できます。 また、オブジェクトの作成中にすべての変数が宣言された場合( new



オブジェクトが呼び出されてinitialize



された直後に上記のように)、未定義の変数( nil



)はありません。



さらに簡単に



コードでは、2つのインスタンス変数を返す2つのメソッド( get_name



およびget_age



)を定義しました。 これは単純で頻繁に使用されるイディオムであるため、Rubyは単純化を提供しますattr_reader



はこれらのメソッドを定義します。



 class Dog attr_reader :name, :age def initialize(name, age) @name = name @age = age end end d = Dog.new("Fido", 2) puts "My name is #{d.name} and I'm #{d.age}"
      
      







attr_reader



はシンボルを使用し(最後のドロップを参照)、出力の値の要求がどのように変更されたかに注意してください。 attr_writer



set



メソッド(最初のリストのattr_writer



を定義し、 attr_accessor



リーダーとライダーの機能を組み合わせます(4番目のドロップの動物園の例を参照)。



初期化+継承



4番目のドロップでは、「zoo」での継承について既に説明しましたが、そこではattr_accessor



を使用しattr_accessor



。 それらを放棄し、 initialize



とメソッドに戻ると、継承はどのようになりますか? それほど難しくありません:



 class Pet def initialize(name, age) @name = name @age = age end def get_name return @name end def get_age return @age end end class Dog < Pet def initialize(name, age) @name = name @age = age super end end class Snake < Pet def initialize(name, age, length) @name = name @age = age @length = length super(name, age) end def get_length return @length end end d = Dog.new('Fido', 2) s = Snake.new('Lili', 2, 85) puts "Dog: My name is #{d.get_name} and I'm #{d.get_age}" puts "Snake: My name is #{s.get_name}, I'm #{s.get_age} & I'm #{s.get_length} cm"
      
      







この例では、猫も拒否しました:)いつものように、最も単純なクラスは階層が上位です。 唯一の違いはsuper



キーワードです。 これは、下位クラスが上位クラスに渡す必要がある変数を示します。 super



はすべての変数を渡しますが、 super()



は単一の変数ではありません。 一般的なメソッドは親クラスに移動し、子孫には変数と独自のメソッドの初期化のみがあります。



オブジェクトメソッド



新しく作成された空のオブジェクトでさえ、すでに多くのメソッドに「応答」しています。 コードを使用してメソッドをリストしますputs d.methods.sort



、ここでd



は任意のオブジェクトです。 すべての中で、 object_id



(すべてのRubyオブジェクトにはメソッドを出力する一意の番号があります)、 class



(オブジェクトが属するクラスを出力します)、および逆のinstance_of?



強調する価値がありinstance_of?



(オブジェクトがパラメーターのクラスに属する場合、trueを返しますputs 10.instance_of?(Fixnum)



たとえば、 puts 10.instance_of?(Fixnum)







respond_to?



メソッドを使用して、オブジェクトが送信するメッセージにオブジェクトが応答できるかどうかを確認できますrespond_to?



。 ほとんどの場合、次の条件で使用されます。



 if d.respond_to?("gav") d.gav else puts "Sorry, don't understand." end
      
      







Rubyのプロセス



ブロック( do ... end



または{...}



)はオブジェクトではありませんが、 lambda



メソッドを使用してProc



クラスのオブジェクトに変換できます。 Proc



からメソッドcall



ブロックをアクティブにしcall



。 メソッドにはprocが含まれる場合があります。



 def method proc puts 'Start of method' proc.call puts 'End of method' end say = lambda {puts 'Hello'} method say
      
      







エピローグ



いくつかのより有用な情報、少し重要な理論、多くのコード。 これはこの種の最後の一滴でした、私は約束します;)それから私たちは真剣にコーディングを始めますが、今のところあなたは目を見てすべての情報を一まとめにして落とす時間があります。 コメントが期待されています!



PS:ご覧のとおり、すべてのドロップは1つのブログにまとめられています。 登録することを忘れないでください-リリースをフォローするのはさらに簡単です!






All Articles