私はinitialize
メソッド内attr_accessors
を使用する従来の方法に精通しています:インスタンスメソッド内でのカスタムライターの呼び出し:なぜ自己は暗黙でないのですか?
class Dog
attr_accessor :name
def initialize(name)
@name = name
end
end
dog = Dog.new("Denver")
p dog.name
=> "Denver"
私はカスタムwriters
とreaders
で遊んでました。私は、次のことを実現するために驚いた:インスタンスメソッド内
- :
self
は暗黙的であるため、明示的にself
を指定せずにreader
方法に呼び出すことができます。 - インスタンスメソッド内では、メソッドを呼び出すには、
self
を明示的に呼び出す必要があります。呼び出すときself
が暗黙的ではないことを示すために、class Dog def name @name end def name=(val) @name = val end def initialize(name) @name = name end def call_name # no need to say: p self.name p name end end dog = Dog.new("Denver") dog.call_name => "Denver"
例2:
self
はインスタンスメソッド内でattr_reader
メソッドを呼び出すときにself
は暗黙的であることを示すために例1attr_writers
のための暗黙的ではありませんインスタンスメソッド内のattr_writers
にあります。
class Dog
def name
@name
end
def name=(val)
@name = val
end
def initialize(name_val)
# works as expected with: self.name = name_val
name = name_val
end
def change_name
# works as expected with: self.name = "foo"
name = "foo"
end
end
dog = Dog.new("Denver")
p dog.name
dog.change_name
p dog.name
=> nil
=> nil
が質問:attr_writers
を呼び出すときに、なぜself
はインスタンスメソッド内で暗黙的ではありませんつまり:私はself
と以下writer
方法を付加していなかったため、インスタンス変数が設定されて取得されていませんか?インスタンスメソッド内でattr_writers
に明示的にself
を指定する必要があるのはなぜですか?
ああ、ありがとうございました。 – Neil