Как исправить `Style / ClassVars` в RuboCop? - PullRequest
0 голосов
/ 31 декабря 2018

Я вижу проблему с использованием переменных класса с Ruby;однако, кажется, документации RuboCop о том, как решить проблему, недостаточно.

Теперь я могу просто проигнорировать это.Учитывая мой проект, это не имеет значения.Но я просто хочу знать, что Рубокоп пытается сказать мне, потому что это не имеет смысла.

Выполнение предоставленного кода в irb 0.9.6 с Ruby 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

Итак, нет.Мы, очевидно, не можем получить доступ к переменной класса без обид.Ирб был очень обижен.Но ruby ​​предлагает использовать @test.Может быть, это была просто опечатка?Давайте попробуем это:

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

Итак, переменная экземпляра никогда не была определена.Что RuboCop пытается сказать здесь?

1 Ответ

0 голосов
/ 31 декабря 2018

Отсутствует разница между областями действия переменных.

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

Доступ к ней можно получить из instance из A:

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

Переменные класса имеют некоторые недостатки при использовании в иерархии классов, поэтому [вероятно] поэтому Rubocop предлагает не использовать переменные класса (или все, что он предлагает - ячестно говоря, никогда не использовал его, так как это приносит больше вреда, чем помощи IMSO.)

В своем первом фрагменте вы пропустили @.Правильный код будет:

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