Переменные экземпляра Ruby и методы - PullRequest
5 голосов
/ 18 мая 2011

Иногда я вижу переменную экземпляра, определенную как @my_variable.Однако иногда я вижу self.my_variable.Когда каждый используется?

Ответы [ 3 ]

12 голосов
/ 18 мая 2011

Переменные экземпляра (@variable) соответствуют частным переменным в других языках.self.myvariable на самом деле не переменная, а вызов метода .Точно так же, если вы пишете self.myvariable = something, это на самом деле вызов self.myvariable=(something).Это соответствует свойствам с геттерами и сеттерами на других языках.

class Foo
  def initialize
    @bar = 42
  end

  def xyzzy
    123
  end

  def xyzzy=(value)
    puts "xyzzy set to #{value}!"
  end
end

obj = Foo.new
puts obj.xyzzy # prints: 123
obj.xyzzy = 2  # prints: xyzzy set to 2
puts obj.bar   # error: undefined method 'bar'

Вы можете использовать attr_reader и attr_accessor для автоматического определения геттеров и сеттеров для переменной экземпляра.attr_reader будет генерировать только геттер, в то время как attr_accessor генерирует оба.

class Parrot
  attr_accessor :volts

  def voom
    puts "vooming at #{@volts} volts!"
  end
end

polly = Parrot.new
polly.volts = 4000
polly.voom   
1 голос
/ 18 мая 2011

Переменные экземпляра более важны, чем методы, вызывающие их.В self.myVariable, myVariable - это метод, ссылающийся на переменную экземпляра @myVariable, и этот метод обычно определяется attr_reader или attr_accessor.

Одной целью объектно-ориентированного программирования является инкапсуляциявещи, характерные для экземпляра внутри этого экземпляра и делающие его недоступным извне.Таким образом, вы можете избежать нежелательных конфликтов имен.Это верно для переменных экземпляра.Они обычно являются параметрами, которые должны обрабатываться в экземпляре, и не должны использоваться вне его.

Внутри экземпляра можно напрямую ссылаться на его переменные экземпляра, и, следовательно, нет необходимости ссылаться на них черезвызовы методов.Вы должны напрямую вызвать переменную @myVariable.

. Из-за пределов экземпляра вы не можете напрямую ссылаться на переменные экземпляра по причине, указанной выше.Но иногда вам нужно обратиться к ним.Цель использования метода myVariable - обратиться к переменной экземпляра снаружи экземпляра.

0 голосов
/ 18 мая 2011

@my_variable относится непосредственно к переменной экземпляра и (по большей части) недоступен извне этого экземпляра.

self.my_variable использует метод доступа (как определено для attr_reader, attr_writer или attr_accessor для внутреннего использования. Это в тех случаях, когда не может быть переменной экземпляра с именем @my_variable (как в случае с атрибутами модели ActiveRecord) или где внутреннее состояние отличается от того, что открыто для общественности.

...