2009-12-09 13 views
6

は、次のように仮定すると:self.attributeと@attributeの利点は?

def create_new_salt 
    self.salt = self.object_id.to_s + rand.to_s 
end 

なぜそれが使用することをお勧めし「自己」。インスタンス変数 '@salt'ではなく?

答えて

13

self.salt =を使用すると、定義されている場合はsalt=メソッドが使用されます。これは、salt=メソッド内のエラーチェック/変換が確実に使用されるようにするのに便利です。しかし、明示的なsalt=メソッド(例えば、attr_accessorによって作成される可能性があります)が必要であることを意味します。これは必ずしも良い考えではありません。

要約:カスタムsalt=メソッドを使用している場合はself.salt =を使用してください。 @saltを正確に知っている場合、またはカスタムsalt=メソッドがない場合は、@salt =を使用してください。

最後の注意:私はおそらく、このように書くと思います(私の意見では、それは少し明確だ)

def create_new_salt 
    @salt = "#{object_id}#{rand}" 
end 

EDIT:別の答えに@チャックのコメントのおかげで、私は削除するために、これを修正しましたself. - 無料コード - それは間違っていた。

+0

ありがとうございましたPeter!私は同意する、私はあなたのバージョンが好きです。 – Kevin

4

Peterの偉大な答えのほかに、私は通常、@attrの代わりにself.attr =とself.attrを使ってattr_accessorを使っていることをRubyに伝えます。

編集:「自己」がなければ、ローカル変数を作成しています。 Yikes。

+0

これは良い点です... – Peter

+2

実際には、 'self ='をレシーバとして指定しないで 'salt = 5'と書くだけで、ローカル変数が作成されます。 – Chuck

+0

@Chuck、これは私が気付かなかった非常に重要なポイントです。私は私の答えを変更しました。 – Peter

2

さらにピーターの答えに:

もう一つの興味深い点は、self.salt=は塩=メソッドがプライベートである場合でも呼び出すことができるということです。これは、明示的な受信者でプライベートメソッドを呼び出せないという通常のRubyルールの例外です。