在`included do ... end`块中,我不应该包含什么内容?

9
我正在使用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
< p >更多的话,< code >@my_module_class 变量将作为< code >MyModule类的包含类的属性可用(顺便说一句:我想让< code >@my_module_class 仅在< code >MyModule 内部“可见”,因为它只打算在该模块中使用)。是否有一些关于如何处理我正在尝试在上面的代码中的< code >included do ... end 块中实例化的情况的“高级”示例或教程?您对此有何建议?

1个回答

2

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


谢谢,但“主要”问题与“在included do ... end块中不应包含什么?”有关,例如,与我的情况相关。其余部分是“更多”,即使对我来说非常重要。然而,我不想让所有的MyModuleClass实例都成为MyModule的实例,而是只在MyModule内部可用;此外,在类定义内部的include MyModule语句是隐式/明显的,因为该模块旨在被包含在一个类中。 - user12882
“我不太能回答‘我不应该做什么’这个问题,因为它太模糊了。但是请看上面我的‘编辑1’部分,我在尝试解决你所问的问题。” - David Grayson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接