2017-01-03 5 views
0

私はinitializeメソッド内attr_accessorsを使用する従来の方法に精通しています:インスタンスメソッド内でのカスタムライターの呼び出し:なぜ自己は暗黙でないのですか?

class Dog 
    attr_accessor :name 

    def initialize(name) 
     @name = name 
    end 
end 

dog = Dog.new("Denver") 
p dog.name 

=> "Denver" 

私はカスタムwritersreadersで遊んでました。私は、次のことを実現するために驚いた:インスタンスメソッド内

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

    例2selfはインスタンスメソッド内でattr_readerメソッドを呼び出すときにselfは暗黙的であることを示すために例1 attr_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を指定する必要があるのはなぜですか?

答えて

0

質問:なぜselfattr_writersのインスタンスメソッド内で暗黙的ではないでしょうか?

ローカル変数の定義が優先されるためです。だからここ

name = "foo" 

はあなたが属性を記述しますが、ローカル変数nameを定義していません。

+0

ああ、ありがとうございました。 – Neil

関連する問題