gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:03:58 25 4
gpt4 key购买 nike

我看到 issue在 Ruby 中使用类变量;然而,RuboCop 似乎是 documentation对于如何解决问题是不够的。

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

执行提供的 codeirb 0.9.6Ruby 2.5.1 中给出:

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 在这里想说什么?

最佳答案

您忽略了变量范围之间的区别。

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实例访问:

A.new.instance_variable_get(:@test)
#⇒ 42

类变量在类层次结构中使用时有一些缺点,这就是 [可能] 为什么 Rubocop 建议不要使用类变量(或者它建议的任何东西——老实说我从来没有使用它,因为它带来的弊大于利恕我直言。)

在您的第一个片段中,您错过了 @。正确的代码是:

class A
# ⇓⇓ HERE
@@test = 10
end
class A
def test
@@test # you can access class variable without offense
end
end

关于ruby - 如何在 RuboCop 中更正 `Style/ClassVars`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53984143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com