类变量可以奇怪地工作,这种使用表明关闭。 @@ammo
的范围是什么? Ammunition
还是Tank
有它自己的副本吗?事实证明,@@ammo
是由模块作用域,并且包含它的类可以简单地访问它。
module Ammunition
def self.included(base)
base.class_eval do
puts "@@ammo was: #{defined?(@@ammo) ? @@ammo.join(',') : 'nil'}"
@@ammo = ['bullets']
puts "@@ammo is now: #{@@ammo}"
puts '---'
end
end
def unload
@@ammo
end
end
class Tank
include Ammunition
@@ammo += ['shells']
end
class Airplane
include Ammunition
@@ammo += ['missiles', 'photon_torpedoes']
end
puts "Tank unloaded: #{Tank.new.unload.join(', ')}"
puts "Airplane unloaded: #{Airplane.new.unload.join(', ')}"
这产生:
@@ammo was: nil
@@ammo is now: bullets
---
@@ammo was: bullets,shells
@@ammo is now: bullets
---
Tank unloaded: bullets, missiles, photon_torpedoes
Airplane unloaded: bullets, missiles, photon_torpedoes
当Tank
包括模块时,它设置@@ammo
从零到在它的子弹的阵列。当Airplane
包含该模块时,它会覆盖我们刚刚设置的弹药值。
这里是你想要做
module Ammunition
def self.included(base)
base.class_eval do
include Ammunition::InstanceMethods
extend Ammunition::ClassMethods
@ammo = ['bullets']
end
end
module ClassMethods
def ammo
@ammo
end
end
module InstanceMethods
def unload
self.class.ammo.join(',')
end
end
end
class Tank
include Ammunition
@ammo += ['shells']
end
class Airplane
include Ammunition
@ammo += ['missiles', 'photon_torpedoes']
end
puts "Tank unloaded: #{Tank.new.unload}"
puts "Airplane unloaded: #{Airplane.new.unload}"
类可以有实例变量是什么,他们的范围更容易理解。并且将你的模块分成实例和类方法可以让你为两者提供功能。这段代码生成以下输出
Tank unloaded: bullets,shells
Airplane unloaded: bullets,missiles,photon_torpedoes
1.为什么Ruby on Rails标记? 2.你的模块被称为'弹药'('弹药'?),但是你后来'包含可压缩的' - 这根本不在这里。 3.你的代码试图做什么并不是很清楚。说明有所帮助,但不完全。 – Telemachus 2010-02-09 00:59:44
谢谢Squeegy - 你设法回答我错综复杂和措辞不佳的/编辑的问题(道歉没有措辞更好)!我真正的问题是,我试图编写一个模块,用于json打包一堆与多态关联绑定在一起的模型。我以设置attr_reader的方式完成了这个任务。 – ambertch 2010-02-10 00:52:08