Есть ли в Ruby разница между `self.i` и` @ i`? - PullRequest
5 голосов
/ 27 сентября 2019

Я думал и пытался, используя @i и self.i взаимозаменяемо, но это выдает ошибку:

class Animal
    def initialize i
        @i = i
    end
    def get_i
        self.i
    end
end
a = Animal.new("Sparky")
puts a.get_i()

Выходы:

source_file.rb: 8:в get_i': undefined method i 'для # (NoMethodError)
из source_file.rb: 12: в `'

Есть ли разница в том, как интерпретатор обрабатывает код?

Ответы [ 2 ]

11 голосов
/ 27 сентября 2019

Конечно, есть разница между self.i и @i:

  • @i вернет значение, присвоенное переменной @i.
  • Принимая во внимание, что self.i вернет значение, которое было возвращено методом с именем i.

В вашем классе Animal не определен метод i, поэтому ошибкасообщение верное.

Если вы хотите, чтобы self.i вернул значение переменной @i, вам нужно создать метод i, подобный этому

def i
  @i
end

или просто использоватьмакрос attr_reader, подобный следующему:

class Animal
  attr_reader :i

  #...
end
1 голос
/ 27 сентября 2019

Разница очень простая.

  • @x - это ссылка на переменную экземпляра
  • self.x - это ссылка на метод экземпляра в этом классе
...