首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby风格/ClassVars cop混淆

Ruby风格/ClassVars cop混淆
EN

Stack Overflow用户
提问于 2021-01-27 16:01:07
回答 1查看 391关注 0票数 0

我在为鲁博克的Style/ClassVars规则而挣扎。它希望我用类实例var替换var @@mutex类。下面是代码,它执行一些缓慢的初始化:

代码语言:javascript
复制
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
  end

Rails有一个很好的助手attr_accessor_with_default,它允许定义一个默认值的访问器,但是它已经被废弃了。相反,使用Ruby,不推荐的消息说。我被卡住了,我真的不知道这段代码应该是什么样子才能让Rubocop满意。通常,属性是在构造函数中初始化的,但这是一个类上下文。我需要初始化互斥体,最好是在类加载期间。

我最初的实现只是使用了@@mutex@@locales,我不知道为什么Rubocop会在这方面如此努力。我知道访问器对于重载很方便,但我知道这一点。要么我在这里遗漏了什么,要么这是一个非常坏的警察,在默认情况下可以启用。

谢谢你的帮助

编辑:这里有一个看起来仍然很奇怪的解决方案,但它有效:

代码语言:javascript
复制
      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
EN

回答 1

Stack Overflow用户

发布于 2021-01-27 16:52:04

RuboCop是对的。假设您有这样一个继承的类:

代码语言:javascript
复制
class VeryFastGettext < FastGettext
end

现在,VeryFastGettext与基类共享相同的互斥锁。这很少是一种理想的行为。

下面的代码可以在合理的情况下安抚RuboCop:

代码语言:javascript
复制
FastGettext.class_eval do
  def self.mutex
    @mutex ||= Mutex.new
  end

  def mutex
    self.class.mutex
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65922825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档