-1

メソッドで定義するとき@foo=3initializeこのように変数にアクセスすることを期待しています。

class Object
  def initialize(v)
    @foo = v
  end

  Object.new.foo

しかし、それは起こりません。書く必要がありますattr_accessor :foo@すでにそれを行っているのに、なぜこれを行う必要があるのですか?

4

5 に答える 5

3

インスタンス変数はプライベートです。それらにアクセスするには、アクセサーとミューテーターが必要です。一般的なアクセサー/ミューテーターのペアは次のようになります。

def foo
  @foo
end

def foo=(value)
  @foo=value
end

これにより、次のように使用できる抽象化が作成されます。

Classname.new.foo
Classname.new.foo="OOP"

これは非常に一般的なニーズであり、多くのボイラープレート (つまり不要) コードが必要になるため、ruby はこれら 2 つのメソッドを文字通り定義する動的メソッドを提供します。

attr_accessor :foo

アクセサーまたはミューテーター メソッドのいずれかのみが必要な場合は、次の対応するメソッドを使用します。

attr_reader :foo
attr_writer :foo

これにより、多くのコピー/貼り付けを節約できます。私がはっきりしていたことを願っています。

于 2013-08-06T13:27:30.667 に答える
0

インスタンス変数は @ 文字で始まります。すべてのインスタンス変数はプライベートです。つまり、変数を読み取ることも、値を変更することもできません。じゃあ何をすればいいの?

class Dog
  def initialize(name)
    @name = name
  end

  def name    #getter
    @name
  end

  def name=(str)  #setter
    @name = str
  end
end

それを入力するのが面倒になるので、ruby はショートカットを提供します。

class Dog
  attr_accessor :name

  def initialize(name)
    @name = name
  end
end
于 2013-08-06T13:35:11.307 に答える