use*_*882 9 ruby module ruby-on-rails activesupport ruby-on-rails-3
我正在使用Ruby on Rails 3.2.2.我正在实现一个模块,并使用RoR ActiveSupport :: Concern功能将其包含在我的课程中.它使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
Run Code Online (Sandbox Code Playgroud)
更多的,将是@my_module_class可作为包括类的属性变量MyModule(BTW:我想提出的@my_module_class是"看得见" 只在内部对MyModule,因为它的目的是要在该模块中只用)?是否有一些"高级"示例或教程如何处理我试图included do ... end在上述代码块中实例化的情况?你有什么建议?
@my_class 将是 MyClass 而不是 MyModule 的实例。如果您想让 MyClass 的所有实例成为 MyModule 的实例,您应该编写:
include MyModule
Run Code Online (Sandbox Code Playgroud)
在类定义里面。
如果您在编辑之前查看该问题的原始版本,我认为我的答案是有道理的。
编辑1:
让我们添加到您的示例中,假设您有一个名为 Foo 的类:
class Foo
include MyModule
end
Run Code Online (Sandbox Code Playgroud)
您想要创建一个与 Foo 关联的 MyModuleClass 实例,但听起来您并不想修改 Foo 或授予其对 MyModuleClass 的访问权限。我建议你使用哈希表:
module MyModule
# ...
@hash = {}
class << self
attr_accessor :hash
end
included do
MyModule.hash[self] = MyModuleClass.new(some_attrs)
end
end
Run Code Online (Sandbox Code Playgroud)
我认为这会起作用,并且它避免将实例变量添加到Foo类对象中。从技术上讲,Ruby 代码的任何部分都可以访问 MyModule.hash,但您应该在源代码中添加注释,告诉人们不要这样做,并且不要宣传哈希值的存在。