2012-03-17 7 views
0

私は終わってしまったRubyistを終了していますが、私はあまり理解していないインスタンス変数の呼び出しに気づきました。ストレートTWGR(15.2.2項)から:Rubyインスタンスの変数の構文

class Person 
    attr_reader :name 
    def name=(name) 
    @name = name 
    normalize_name 
    end 

    private 
    def normalize_name 
    name.gsub!(/[^-a-z'.\s]/i, "") 
    end 
end 

はnormalize_name方法でname変数の暗黙のインスタンス変数ですか? @name.gsub!(/[^-a-z'.\s]/i, "")も同様に効果がありますか?私が知っておくべきいくつかの大会がありますか?

答えて

2

normalize_nameの場合、nameは、クラスマクロの最上部に定義されているself.nameというメソッドに解決されます。あなたの代わりにattr_accessorを使用した場合、name=方法は、同様に定義されるだろう(それはnormalize_nameへの呼び出しが含まれていないでしょう。

これらのgetterメソッドとsetterメソッドが自動的にインスタンス変数にアクセスする。attr_accessible :nameによって定義されたname方法がどのように見えます基本的にこれは、:

def name 
    @name 
end 
+0

'name'メソッドの代わりに' @name'変数を直接参照するのは効果がありますか? 'name'メソッドを使う利点がありますか? – rringler

+0

彼らは同じ基本的なことをしますが、getterを使用する方が安全です。後で行を書き込む場合は、書き込み時ではなく読み込み時にデータを変更することにしますか? – coreyward

+0

ご協力いただきありがとうございます! – rringler

0

normalize_name方法でname変数に暗黙のインスタンス変数です

いいえ、インスタンス変数ではありません。インスタンス変数は@ sigilで始まり​​ますが、インスタンス変数ではない可能性があります。実際には、それは変数ではありません。、それはメッセージです。