我看到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在这里想说什么?
答案 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
)。