0

"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
4

4 に答える 4

1

これらは 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 メソッドの両方が提供されます。

于 2013-07-18T21:20:52.270 に答える
1

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
于 2013-07-18T21:07:10.500 に答える
0

これらのメソッドは、(当然のことながら) 変数を「取得」または「設定」するため、「ゲッター」および「セッター」として知られています。1 つをデータに何らかの変更を加える「コマンド」、もう 1 つを単に値を報告する「クエリ」と考えることもできます (これは、独自のメソッドも同様です)。

Ruby には、これらのゲッターとセッターを定義する 3 つのクラス メソッドが含まれています。attr_readerゲッターをattr_writer定義し、セッターをattr_accessor定義し、両方を定義します。

インスタンス変数を直接操作することもできますが、ほとんどの場合、コードは簡単に変更でき、メソッドを使用してデータにアクセスする場合は、データ自体を操作するよりも簡単に判断できます。

于 2013-07-18T21:09:06.250 に答える