我在为鲁博克的Style/ClassVars规则而挣扎。它希望我用类实例var替换var @@mutex类。下面是代码,它执行一些缓慢的初始化:
FastGettext.class_eval do
attr_writer :mutex
attr_accessor :locales
def mutex
# Style/ClassVars: Replace class var @@mutex with a class instance var.
@@mutex ||= Mutex.new
end
def human_available_locales
original_locale = FastGettext.locale
mutex.synchronize do
return locales if locales
# perform loading and translating of locale names
# (removed)
locales
end
ensure
FastGettext.locale = original_locale
end
endRails有一个很好的助手attr_accessor_with_default,它允许定义一个默认值的访问器,但是它已经被废弃了。相反,使用Ruby,不推荐的消息说。我被卡住了,我真的不知道这段代码应该是什么样子才能让Rubocop满意。通常,属性是在构造函数中初始化的,但这是一个类上下文。我需要初始化互斥体,最好是在类加载期间。
我最初的实现只是使用了@@mutex和@@locales,我不知道为什么Rubocop会在这方面如此努力。我知道访问器对于重载很方便,但我知道这一点。要么我在这里遗漏了什么,要么这是一个非常坏的警察,在默认情况下可以启用。
谢谢你的帮助
编辑:这里有一个看起来仍然很奇怪的解决方案,但它有效:
FastGettext.class_eval do
attr_accessor :mutex, :locales
self.mutex = Mutex.new
def human_available_locales
original_locale = FastGettext.locale
mutex.synchronize do
return locales if locales
# ...
locales
end
ensure
FastGettext.locale = original_locale
end
end发布于 2021-01-27 16:52:04
RuboCop是对的。假设您有这样一个继承的类:
class VeryFastGettext < FastGettext
end现在,VeryFastGettext与基类共享相同的互斥锁。这很少是一种理想的行为。
下面的代码可以在合理的情况下安抚RuboCop:
FastGettext.class_eval do
def self.mutex
@mutex ||= Mutex.new
end
def mutex
self.class.mutex
end
endhttps://stackoverflow.com/questions/65922825
复制相似问题