一般的に、いいえ、self.stuff = stuff
と@stuff = stuff
は異なります。前者はオブジェクトに対してメソッド呼び出しをstuff=
行いますが、後者はインスタンス変数を直接設定します。前者は(クラスで特にプライベートとして宣言されていない限り)パブリックである可能性のあるメソッドを呼び出しますが、後者は常にプライベートインスタンス変数を設定します。
通常、attr_accessor :stuff
クラスで定義するのが一般的であるため、同じように見えます。attr_accessor
ほぼ次と同等です。
def stuff
@stuff
end
def stuff=(s)
@stuff = s
end
したがって、その場合、それらは機能的に同一です。ただし、パブリックインターフェイスを定義して、異なる結果と副作用を許容することは可能です。これにより、これら2つの「割り当て」が明らかに異なります。
def stuff
@stuff_called += 1 # Keeps track of how often this is called, a side effect
return @stuff
end
def stuff=(s)
if s.nil? # Validation, or other side effect. This is not triggered when setting the instance variable directly
raise "Argument should not be nil"
end
@stuff = s
end