Here's the source for cattr_accessor
Và
Here's the source for 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 like Avdi mentions.
Tuy nhiên, cattr_accessor
không hoạt động trong mô-đun, vì vậy, chúng cũng ít nhiều đã sao chép mã để hoạt động cho cá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, như vậy 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 thể hiện. mattr_accessor
cũng cho phép bạn thực hiện việc này.
Tuy nhiên, trong trường hợp thứ hai, hành vi của nó khá 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"
Nguồn
2008-10-09 19:51:35
Trong ví dụ của bạn, bạn giải thích rằng 'mattr_accessor' sẽ là viết tắt của các biến lớp dụ (' @ variable's), nhưng mã nguồn dường như tiết lộ họ thực sự thiết lập/đọc các biến lớp. Bạn có thể giải thích sự khác biệt này không? – sandre89