我正在使用Ruby on Rails 3.2.2。我正在实现一个模块,并通过使用RoR ActiveSupport::Concern功能将该模块包括在我的类(class)中。它使内部声明的included do ... end
块生成代码可用,该代码在包含模块的类的类上下文中执行。
我的疑问是:应该在included do ... end
块中添加而不包括吗?也就是说,例如,进行以下操作是否是“常见”/“良好”做法?
module MyModule
extend ActiveSupport::Concern
class MyModuleClass
attr_accessor :attr1, :attr2, :attr3
def initialize(attrs)
@attr1 = attrs[:attr1]
@attr2 = attrs[:attr2]
@attr3 = attrs[:attr3]
end
end
included do
@my_module_class = MyModuleClass.new(some_attrs)
end
end
还有,
@my_module_class
变量是否可以作为MyModule
的包含类中的属性使用(顺便说一句:我想使@my_module_class
仅在MyModule
内部“可见”,因为它仅打算在该模块中使用)?是否存在一些“高级”示例或教程,以解决如何在上述代码的included do ... end
块中实例化这样的情况?您有什么建议? 最佳答案
@my_class将是MyClass的实例,而不是MyModule。如果要使MyClass的所有实例成为MyModule的实例,则应编写:
include MyModule
在类定义中。
我认为如果您在编辑之前先查看该问题的原始版本,我的回答就很有意义。
编辑1:
让我们添加到您的示例中,并说您有一个名为Foo的类:
class Foo
include MyModule
end
您想创建一个与Foo关联的MyModuleClass的实例,但这听起来像您并不是真的想要修改Foo或让其访问MyModuleClass。我建议您使用哈希表:
module MyModule
# ...
@hash = {}
class << self
attr_accessor :hash
end
included do
MyModule.hash[self] = MyModuleClass.new(some_attrs)
end
end
我认为这将起作用,并且避免将实例变量添加到
Foo
类对象。从技术上讲,ruby代码的任何部分都可以访问MyModule.hash,但是您应该在源代码中添加注释,告诉人们不要这样做,并且不要广告哈希存在。关于ruby-on-rails - 我不应该在 `included do ... end`块中包含什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12957743/