メソッドで定義するとき@foo=3
、initialize
このように変数にアクセスすることを期待しています。
class Object
def initialize(v)
@foo = v
end
Object.new.foo
しかし、それは起こりません。書く必要がありますattr_accessor :foo
。@
すでにそれを行っているのに、なぜこれを行う必要があるのですか?
メソッドで定義するとき@foo=3
、initialize
このように変数にアクセスすることを期待しています。
class Object
def initialize(v)
@foo = v
end
Object.new.foo
しかし、それは起こりません。書く必要がありますattr_accessor :foo
。@
すでにそれを行っているのに、なぜこれを行う必要があるのですか?
インスタンス変数はプライベートです。それらにアクセスするには、アクセサーとミューテーターが必要です。一般的なアクセサー/ミューテーターのペアは次のようになります。
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
これにより、多くのコピー/貼り付けを節約できます。私がはっきりしていたことを願っています。
インスタンス変数は @ 文字で始まります。すべてのインスタンス変数はプライベートです。つまり、変数を読み取ることも、値を変更することもできません。じゃあ何をすればいいの?
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