Я думаю, что некоторые Руби внутренности - PullRequest
0 голосов
/ 23 мая 2011
class MyClass

  def instance_variable=(var)
    puts "inside getter"
    instance_variable = var
  end

  def function_1
    self.instance_variable = "whatever"
  end

  def function_2
    @instance_variable = "whatever"
  end

end



myclass = MyClass.new

myclass.function1

результаты с "внутренним геттером" на консоли

myclass.function2

нет.

Я новичок в Ruby, не знаю разницы, не могу найти его в Интернете ...

Заранее спасибо!

EDIT:

Я предположил, что, добавив «=», я перезаписываю метод получения для неявно определенной переменной экземпляра «instance_variable».

Это также причина, почему я назвал это так.

Мне не разрешалось использовать "=" в именах функций.

Вот почему я предположил, что это будет иметь какое-то особое значение.

Спасибо за вашу помощь.

EDIT2:

Я просто подумал, что действительно перезаписал назначение, а не только получатель. Я все перепутал.

Извините и спасибо.

1 Ответ

4 голосов
/ 23 мая 2011

Вы (в заблуждение) назвали своего сеттера instance_variable.Это не переменная экземпляра, это метод, который устанавливает переменную экземпляра.

Когда вы вызываете self.instance_variable=, вы вызываете этот метод.Когда вы устанавливаете @instance_variable напрямую, вы устанавливаете саму переменную, и поэтому метод установки не вызывается.

Более идиоматическое соглашение об именах будет выглядеть примерно так:Конечно, для простых методов получения и установки сквозного типа вы можете использовать

attr_reader :name #generates getter only
attr_writer :name #generates setter only, not very common
attr_accessor :name #generates getter and setter

Вышеуказанные методы являются синтаксическим сахаром, который генерирует для вас методы get и / или set.Позже они могут быть переопределены, чтобы обеспечить дополнительную функциональность при необходимости.


РЕДАКТИРОВАТЬ: я вижу, что вы сделали обновление и просто хотели указать, что этот метод вообще не устанавливает переменную экземпляра:

def instance_variable=(var)
  puts "inside getter"
  instance_variable = var
end

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

...