นี่คือแหล่งที่มาของ 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
แต่ดูเหมือนว่าซอร์สโค้ดจะเปิดเผยว่าพวกเขากำลังตั้งค่า / อ่านตัวแปรคลาส คุณช่วยอธิบายความแตกต่างนี้ได้ไหม