여기에 대한 소스가 있습니다. cattr_accessor
과
여기에 대한 소스가 있습니다. mattr_accessor
보시다시피 그들은 거의 동일합니다.
두 가지 버전이있는 이유는 무엇입니까? 때로는 cattr_accessor
모듈 을 작성 하여 Avdi 언급과 같은 구성 정보에 사용할 수 있습니다 .
그러나 cattr_accessor
모듈에서는 작동하지 않으므로 모듈에서도 작동하도록 코드를 다소 복사했습니다.
또한 어떤 클래스가 모듈을 포함 할 때마다 해당 클래스 메서드와 모든 인스턴스 메서드를 가져 오도록 모듈에 클래스 메서드를 작성하려고 할 수도 있습니다. mattr_accessor
또한 이것을 할 수 있습니다.
그러나 두 번째 시나리오에서는 동작이 매우 이상합니다. 다음 코드를 관찰하십시오. 특히 @@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)의 약자 라고 설명 하지만 소스 코드는 실제로 클래스 변수를 설정 / 읽고 있음을 보여줍니다. 이 차이점을 설명해 주시겠습니까?