因此,儘管我完全反對擴大現有類這樣,有時(黑客rspec
)有必要做這樣的事情類變量:可以訪問一個模塊中定義
module MyModule
module ClassMethods
def define_something(name)
@@names ||= []
@@names << name
end
end
def self.included(base)
base.extend ClassMethods
end
def all_names
@@names
end
end
class Example
include MyModule
define_something "one"
define_something "two"
end
Example.new.all_names
,然後它產生這個錯誤:
NameError: uninitialized class variable @@names in MyModule
而且據我所知,因爲在寫MyModule::ClassMethods
的時間 - 我們在示例中未類(不self.
)工作,所以我嘗試:
module MyModule
module ClassMethods
def define_something(name)
@names ||= []
@names << name
end
end
def self.included(base)
base.extend ClassMethods
end
def all_names
@@names
end
end
class Example
include MyModule
define_something "one"
define_something "two"
end
Example.new.all_names
它不工作,要麼,我終於結束了:
module MyModule
module ClassMethods
def define_something(name)
@names << name
end
end
def self.included(base)
base.instance_variable_set(:@names, [])
base.send(:define_method, :all_names) { base.instance_variable_get(:@names) }
base.extend ClassMethods
end
end
class Example
include MyModule
define_something "one"
define_something "two"
end
Example.new.all_names
有沒有更好的方式來做到這一點?
'@@'和'@'是完全不同的。無論您處於類還是實例上下文中,都不能使用@ @訪問「@@」變量,反之亦然。 – meagar