在使用 Discourse 的多线程 Ruby 实现和服务器(TruffleRuby/Puma)时,标志设置中的不安全哈希使用会产生错误,并且这种惰性初始化模式需要避免重复赋值:
3 个赞
在 initializer 中简单调用 PostActionType.flag_settings 能解决这个问题吗?(例如,只是暂时插入这里:discourse/config/initializers/000-mini_sql.rb at 3e0cb8ea47ea27cb3b564ac10656884739e4d78c · discourse/discourse · GitHub
我猜我们也可以同步这个块。Truffle 还有提出其他重大问题吗?
2 个赞
是的,这应该可行。
有什么理由需要惰性初始化吗?
急切初始化可以避免任何同步问题,并且访问速度稍快,也更简单。
1 个赞
坦白说,我也不确定这个惰性初始化在这里是否有意义,我们有一个插件钩子可以替换整个标志集,但这会在初始化器之前触发。
@roman 对这里进行急切初始化有什么顾虑吗?我想一个简单的修复方法是:
class << self
def flag_settings
...
end
end
flag_settings
我想到这发生的主要原因是 Ruby 没有提供一个干净的类初始化模式,所以它会迫使开发者发明自己的模式/使用惰性初始化。
2 个赞
也可以这样做,这可以避免两次读取 ivar,并使其更清晰地表明它是急切初始化的(当然,逻辑也可以放在 initial_flag_settings 辅助方法中以进行组织):
class << self
attr_reader :flag_settings
end
@flag_settings = FlagSettings.new
@flag_settings.add(
3,
:off_topic,
notify_type: true,
auto_action_type: true,
)
# ...
2 个赞
是的,我认为在这里进行急切初始化是安全的。它也不应与很少使用的插件 API 冲突。
3 个赞
这是个PR:
4 个赞
该主题已在 4 天后自动关闭。不允许回复。