gpt4 book ai didi

ruby-on-rails - 我不应该在 `included do ... end` block 中包含什么?

转载 作者:数据小太阳 更新时间:2023-10-29 06:50:47 26 4
gpt4 key购买 nike

我正在使用 Ruby on Rails 3.2.2。我正在实现一个模块,并通过使用 RoR ActiveSupport::Concern 将其包含在我的类(class)中特征。它使 included do ... end block 可用,使内部声明的代码在包含模块的类的类上下文中执行。

我的疑问是:我应该included do ... end block 中包含什么?也就是说,例如,是进行以下操作是一种“常见”/“良好”的做法吗?

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_classMyModule 内部“可见” 因为它仅用于模块)?是否有一些“高级”示例或教程介绍如何处理我试图在上述代码的 included do ... end block 中实例化的情况?你有什么建议?

最佳答案

@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` block 中包含什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12957743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com