5

Ruby の優れたコーディング スタイルを取得しようとしています。同じ名前のローカル変数を誤って呼び出すのを防ぐために、私は常にself.適切な場所で使用しています。しかし今、私はこれにつまずいた:

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

上記のコードはエラーになります

sanitize_name呼び出されたプライベートメソッド

しかし、削除self.して使用するだけsanitize_nameで機能します。なぜですか?

4

2 に答える 2

8

これは、プライベート メソッドを明示的なレシーバーで呼び出すことができず、暗黙的なレシーバー (これも ) に依存するのではなく、を受け取る必要がself.sanitize_nameあるオブジェクト ( ) を明示的に指定しているためです。selfsanitize_nameself

sanitize_nameこれを避けることはできません。明示的なレシーバーなしでプレーンな古いものを呼び出すか、またはself.send(:sanitize_name). 常に明示的に指定することselfが本当に「良いスタイル」かどうかはわかりませんが、それは主観的なものです。変数ではなくメソッドを呼び出していることを確認したい場合は、括弧を追加します。

def a; "method"; end
a = "variable"
a() #=> "method"
a   #=> "variable"
于 2012-08-12T16:21:39.347 に答える
2

なんで?

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

于 2012-08-13T01:23:24.913 に答える