如何在RuboCop中更正`Style / ClassVars`?

时间:2018-12-31 06:07:28

标签: ruby rubocop

我看到issue与Ruby一起使用类变量;但是,RuboCop的documentation对于解决此问题似乎还不够。

现在,我可以忽略它。鉴于我的项目,没关系。但是,我只想知道Rubocop试图告诉我做什么,因为这没有任何意义。

irb 0.9.6执行Ruby 2.5.1中提供的code会得出:

class A
  @test = 10
end
#=> 10
class A
  def test
    @@test # you can access class variable without offense
  end
end
#=> :test
A.new.test
Traceback (most recent call last):
        3: from /Users/Ricky/.rbenv/versions/2.5.1/bin/irb:11:in `<main>'
        2: from (irb):12
        1: from (irb):9:in `test'
NameError (uninitialized class variable @@test in A)
Did you mean?  @test

所以,不。我们显然不能无罪地访问类变量。 irb 非常得罪了。但是,ruby建议使用@test。也许只是错字?试试吧:

class A
  @test = 10
  def test
    @test # you can access class variable without offense
  end
end
#=> :test
A.new.test
#=> nil

因此,从未定义实例变量。 RuboCop在这里想说什么?

2 个答案:

答案 0 :(得分:2)

您错过了变量范围之间的差异。

<NavigationView.MenuItems>
        <NavigationViewItem Content="Menu Item1" Foreground="Black" Tag="Home_Page" Height="38" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch"  />
        <NavigationViewItem Content="Instalpage" Foreground="Black" Tag="Install_Page" />
        <NavigationViewItem Content="Menu Item3" Foreground="Black" Tag="SamplePage3" />
        <NavigationViewItem Content="Menu Item4" Foreground="Black" Tag="SamplePage4" />
</NavigationView.MenuItems>

以上内容在类范围内声明了一个实例变量。可以通过

访问
class A
  @test = 42
end

您可以为此变量定义一个访问器:

A.instance_variable_get(:@test)
#⇒ 42

它在实例之间共享,要从实例访问它,您应该参考该类:

class A
  @test = 42
  def self.test
    @test
  end
end

A.test #⇒ 42

以下代码在类实例上声明一个实例变量:

#     ⇓⇓⇓⇓⇓ HERE
A.new.class.test #⇒ 42

可以从class A def initialize @test = 42 end end 实例进行访问:

A

在类层次结构中使用类变量时,存在一些缺点,这就是[Rubcop]为什么不建议Rubocop建议使用类变量(或其所建议的任何方法,我实话从未使用过,因为它带来的危害大于帮助IMSO。)< / p>

在您的第一个摘要中,您错过了A.new.instance_variable_get(:@test) #⇒ 42 。正确的代码是:

@

答案 1 :(得分:0)

关于“修复” RuboCop问题,您可以添加如下异常:

Style/ClassVars:
  Exclude:
    - 'path/to/your/file.rb'

当然,正如Aleksei所提到的,如果您想要在类的所有实例之间共享的 static 变量(使用C ++语言)(实际上是给定范围的全局变量),是此类的名称),您需要的是另外的@(您在一个地方使用了@test,在另一个地方使用了@@test)。