今すぐ
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つのブログにまとめられています。 登録することを忘れないでください-リリースをフォローするのはさらに簡単です!