Как легко получить доступ к установщику классов?

Как можно легко установить доступ к одному и тому же классу?

Допустим, у меня есть этот вызов:

# some_file.rb , create a new object
temperature = Measurement.new 'temperature', 36.6

И модель:

# Measurements.rb , some model
class Measurement
  attr_accessor :value, :type
  attr_reader :device, :title, :label

  def initialize type, value
    # This one works, but not trigger the setter
    @type = type
    # And this one trigger setter
    self.type = type
  end

  def type= new_type
    # do something very important
  end    
end

Означает ли это, что мне всегда нужно использовать self.var = вместо @var =, если я когда-нибудь захочу использовать сеттеры с этой переменной, не переименовывая ее везде в классе? Есть ли еще какая-то разница и есть ли лучший способ добавить сеттер?


person lifecoder    schedule 06.12.2012    source источник
comment
Ваш код сбивает с толку. Вы не сможете создать экземпляр до того, как определите конструктор. Порядок в вашем коде неправильный, или вам нужно четко указать, что вы цитируете две разные части своего кода.   -  person sawa    schedule 06.12.2012
comment
Спасибо, это действительно два разных файла.   -  person lifecoder    schedule 06.12.2012


Ответы (1)


Да, всегда так. В Ruby нет такой вещи, как сеттер. Просто метод, который заканчивается на =. Однако из-за неоднозначности синтаксиса вы всегда должны предварять сеттеры объектом и точкой, иначе Ruby вместо этого увидит присваивание локальной переменной.

Другими словами, помните, что @blah — это необработанный доступ, и он никогда не вызовет метод (не совсем так, есть некоторые методы протоколирования и отладки, но неважно).

Так что просто живите с self.blah=, если ваш сеттер так важен.

person Linuxios    schedule 06.12.2012