一緒に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.newName.newと、 Classからnewインスタンスメソッドが呼び出され、新しいオブジェクトのinitializeメソッドが呼び出される前に、 allocateをアクティブallocateしてオブジェクトにメモリを割り当てます。 オブジェクトの構築と初期化のフェーズは別々であり、書き換えることができます。 初期化は、インスタンスのinitializeメソッドを介して行われ、構築はnew介して行われます。 initializeinitializeはありません(もちろん議論の余地がありますが、ソースが異なれば意見も異なります)。

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_writersetメソッド(最初のリストの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つのブログにまとめられています。 登録することを忘れないでください-リリースをフォローするのはさらに簡単です!

Source: https://habr.com/ru/post/J49149/


All Articles