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