2012-08-12 12 views
5

というプライベートメソッド` xxx 'というエラーが発生しました。私は良いRubyコーディングスタイルを取得しようとしています。誤って同じ名前のローカル変数を呼び出さないように、私はいつもself.を適切に使用しています。しかし、今、私はこのつまずい:他のプライベートメソッド内からself.xxx()を使用してプライベートメソッドxxxを呼び出すと、 "

class MyClass < ActiveRecord::Base 
    before_validation :sanitize_user_data 

    private 

    def sanitize_user_data 
    self.sanitize_name # with ".self" it's a problem, without it's not! 
    end 

    def sanitize_name 
    unless self.name.nil? 
     self.name.gsub!(/\s+/, ' ') 
     self.name.strip! 
    end 
    end 
end 

上記のコードの結果をエラー

が、 self.を削除し、ちょうど sanitize_nameを使用した場合、それが動作するというプライベートメソッド sanitize_nameに。それはなぜですか?プライベートメソッドは、明示的な受信機と呼ばれ、そして self.sanitize_nameが明示的に(も selfである)ではなく、暗黙の受信機に頼るよりも、 sanitize_nameを受けるべきオブジェクト( self)を指定されたと言ってすることはできませんので

答えて

8

これが起こります。

これを回避することはできません。明示的な受信者なしで古いsanitize_nameを呼び出すか、self.send(:sanitize_name)とする必要があります。 selfを明示的に指定するのは本当に「良いスタイル」だとはっきりしませんが、それは主観的です。あなたがあなたの代わりに変数のメソッドを呼び出していることを確認したい場合は、括弧を追加します。

def a; "method"; end 
a = "variable" 
a() #=> "method" 
a #=> "variable" 
+0

ありがとうございます。私はこれを念頭に置いておくつもりですが、実際に理解していると思います。私はRubyの内部を深く掘り下げなければならないでしょうか? –

+3

@JoshuaMuheim明示的な受信者を禁止することによって、プライベートメソッドが動作する方法であるとは限りません。暗黙的な受信者は、同じ「自己」ではありません。どこからでも呼び出すことはできません。暗黙受信者と同じ明示的受信者を持つプライベートメソッドを呼び出します。 –

+0

さて、それは面白いです。説明してくれてありがとう。 :) –

2

それはなぜですか?

定義による。プライベートメソッドは、受信者なしのメッセージ送信によってのみ呼び出すことができます。の定義の意味はprivateを意味します。

+0

+1ショート&スイートです。 –

関連する問題