我应该在`included do ... end`块中包含哪些内容?

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在上述代码块中实例化的情况?你有什么建议?

Dav*_*son 2

@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,但您应该在源代码中添加注释,告诉人们不要这样做,并且不要宣传哈希值的存在。