gpt4 book ai didi

ruby - 在 Mixins 中初始化实例变量

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

是否有任何干净的方法来初始化旨在用作 Mixin 的模块中的实例变量?例如,我有以下内容:

module Example

def on(...)
@handlers ||= {}
# do something with @handlers
end

def all(...)
@all_handlers ||= []
# do something with @all_handlers
end

def unhandled(...)
@unhandled ||= []
# do something with unhandled
end

def do_something(..)
@handlers ||= {}
@unhandled ||= []
@all_handlers ||= []

# potentially do something with any of the 3 above
end

end

请注意,我必须一次又一次地检查每个 @member 是否已在每个函数中正确初始化——这有点让人恼火。我更愿意写:

module Example

def initialize
@handlers = {}
@unhandled = []
@all_handlers = []
end

# or
@handlers = {}
@unhandled = []
# ...
end

并且不必反复确保事物已正确初始化。但是,据我所知这是不可能的。除了向 Example 添加 initialize_me 方法并从扩展类调用 initialize_me 之外,有什么办法可以解决这个问题吗?我确实看到了 this example , 但我不可能为了完成这个而将东西猴子修补到 Class 中。

最佳答案

module Example
def self.included(base)
base.instance_variable_set :@example_ivar, :foo
end
end

编辑:请注意,这是设置类实例变量。当模块混合到类中时,无法创建实例上的实例变量,因为这些实例尚未创建。不过,您可以在混入中创建一个初始化方法,例如:

module Example
def self.included(base)
base.class_exec do
def initialize
@example_ivar = :foo
end
end
end
end

可能有一种方法可以在调用包含类的初始化方法时执行此操作(有人吗?)。不确定。但这里有一个替代方案:

class Foo
include Example

def initialize
@foo = :bar
after_initialize
end
end

module Example
def after_initialize
@example_ivar = :foo
end
end

关于ruby - 在 Mixins 中初始化实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12586051/

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