attr_internalについて
attr_internal_*はActiveSupportの機能で、名前衝突のリスクを回避してくれる機能です。
アクセサメソッドについては以下に書いています。
あるクラスを継承したサブクラスを作るとき、クラスインスタンス変数が衝突する可能性が有ります。これを避けるために親クラスでattr_internal_*を使います。
また、attr_internalはattr_internal_accessorのエイリアスです。
実際のコードです。読むと21行目でインスタンス変数の名前にアンダーバーつけて31行目でattr_*呼んでるだけですね。
instance_eval{}で確認するとそうなっていることが分かります。
require 'active_support' require 'active_support/core_ext' class AttrTest attr_internal :test end > at = AttrTest.new #<AttrTest:0x007f83f2950178> > at.instance_eval{@test = "var"} "var" > at.test nil > at.instance_eval{@_test = "_var"} "_var" > at.test "_var"
Railsのいたるところで使われています。以下はaction_mailerです。 github.com