我正在使用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/

10-13 05:29