"def name" と "def name=()" のコード スニペットについて誰が説明してくれますか? なぜ2回定義されているのかわかりません。
class Bird < Animal
def initialize(name, length)
@name
@length
end
def name
@name
end
def name=(new_name)
@name = new_name
end
end
これらは getter メソッドと setter メソッドです
bird = Bird.new("pigeon", length)
=> #<Bird:0x007f93e9b41278>
bird.name
=> "pigeon"
bird.name = 'seagull'
=> "seagull"
bird.name
=> "seagull"
クラスで定義したメソッドは両方とも、ここで呼び出されているものです - への呼び出し
bird.name = 'seagull'
実際にはメソッド呼び出しの構文糖衣です
bird.name=('seagull')
もちろん、これらのメソッドを記述する最も「ルビっぽい」方法は、attr_accessor を 1 回呼び出すことです。
class Bird < Animal
attr_accessor :name
def initialize(name, length)
@name = name
@length = length
end
end
これにより、name 属性の getter メソッドと setter メソッドの両方が提供されます。
1 つは値を返し、もう 1 つは値を設定します。メソッド本体を見てください。
def name
@name # return @name
end
def name=(new_name)
@name = new_name # set @name to your argument
end
また、初期化メソッドは何もしません。これらの変数を、取っている引数に設定したいと思います。
def initialize(name, length)
@name, @length = name, length
end
これらのメソッドは、(当然のことながら) 変数を「取得」または「設定」するため、「ゲッター」および「セッター」として知られています。1 つをデータに何らかの変更を加える「コマンド」、もう 1 つを単に値を報告する「クエリ」と考えることもできます (これは、独自のメソッドも同様です)。
Ruby には、これらのゲッターとセッターを定義する 3 つのクラス メソッドが含まれています。attr_reader
ゲッターをattr_writer
定義し、セッターをattr_accessor
定義し、両方を定義します。
インスタンス変数を直接操作することもできますが、ほとんどの場合、コードは簡単に変更でき、メソッドを使用してデータにアクセスする場合は、データ自体を操作するよりも簡単に判断できます。