Đây là nguồn cho cattr_accessor
Và
Đây là nguồn cho mattr_accessor
Như bạn có thể thấy, chúng khá giống nhau.
Tại sao có hai phiên bản khác nhau? Đôi khi bạn muốn viết cattr_accessor
trong một mô-đun, vì vậy bạn có thể sử dụng nó cho thông tin cấu hình như Avdi đã đề cập .
Tuy nhiên, cattr_accessor
không hoạt động trong một mô-đun, vì vậy ít nhiều họ đã sao chép mã sang đó để hoạt động cho cả mô-đun.
Ngoài ra, đôi khi bạn có thể muốn viết một phương thức lớp trong một mô-đun, chẳng hạn như bất cứ khi nào bất kỳ lớp nào bao gồm mô-đun, nó sẽ nhận được phương thức lớp đó cũng như tất cả các phương thức phiên bản. mattr_accessor
cũng cho phép bạn làm điều này.
Tuy nhiên, trong kịch bản thứ hai, hành vi của nó khá kỳ lạ. Quan sát đoạn mã sau, đặc biệt lưu ý các @@mattr_in_module
bit
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
sẽ là viết tắt của (@variable
các) biến cá thể lớp , nhưng mã nguồn dường như tiết lộ rằng chúng thực sự đang thiết lập / đọc các biến lớp. Bạn có thể vui lòng giải thích sự khác biệt này?