ここにソースがあります cattr_accessor
そして
ここにソースがあります mattr_accessor
ご覧のとおり、これらはほとんど同じです。
なぜ2つの異なるバージョンがあるのですか?時にはcattr_accessor
モジュールを書きたいので、Avdiが言及するような構成情報にそれを使用できます。
ただし、cattr_accessor
モジュールでは機能しないため、モジュールでも機能するようにコードをコピーしました。
さらに、モジュールにクラスメソッドを記述して、クラスにモジュールが含まれている場合は常に、そのクラスメソッドとすべてのインスタンスメソッドを取得することもできます。 mattr_accessor
また、これを行うことができます。
ただし、2番目のシナリオでは、その動作はかなり奇妙です。次のコードを確認し、特に@@mattr_in_module
ビットに注意してください
module MyModule
mattr_accessor :mattr_in_module
end
class MyClass
include MyModule
def self.get_mattr; @@mattr_in_module; end # directly access the class variable
end
MyModule.mattr_in_module = 'foo' # set it on the module
=> "foo"
MyClass.get_mattr # get it out of the class
=> "foo"
class SecondClass
include MyModule
def self.get_mattr; @@mattr_in_module; end # again directly access the class variable in a different class
end
SecondClass.get_mattr # get it out of the OTHER class
=> "foo"
mattr_accessor
がクラスインスタンス変数(@variable
s)の略であることを説明していますが、ソースコードは、それらが実際にクラス変数を設定/読み取りしていることを明らかにしているようです。この違いについて説明してもらえますか?