Лучший способ установить значение по умолчанию для свойства без ActiveRecord?

Я думал, что этот вопрос (Как сделать attr_accessor_with_default в ruby?) ответил на мой вопрос, но я не использую ActiveRecord и after_initialize зависит от него.

Какова наилучшая практика Ruby для реализации значения по умолчанию для attr_accessor? Является это самое близкое к документации об этом? Должен ли я перестать использовать attr_accessor, поскольку он является приватным?

Ответ 1

class Foo
  # class-level instance variable

  # setting initial value (optional)
  @class_var = 42  

  # making getter/setter methods on the class itself
  class << self
    attr_accessor :class_var
  end

  # instance-level variable getter/setter methods
  attr_accessor :inst_var
  def initialize
    # setting initial value (optional)
    @inst_var = 17
  end
end

p Foo.class_var
#=> 42
Foo.class_var = 99
p Foo.class_var
#=> 99

f1 = Foo.new
f2 = Foo.new
f2.inst_var = 1
p [f1.inst_var, f2.inst_var]
#=> [17,1]

Ответ 2

@Phrogz дал хорошее решение, но вы должны знать об этом больше.

Здесь вы делаете class-level instance variable, который на самом деле не является переменной класса, но кто заботится, потому что после инициализации реальной переменной класса с тем же именем вы теряете старую ссылку.

Чтобы проверить fakeess, используйте приведенный выше код, но с массивом:

class Foo
  @class_var = [42]
  class << self
    attr_accessor :class_var
  end
end
b = [Foo.class_var]
Foo.class_var = 69
p b # still [[42]] 

И вы столкнетесь с проблемой при попытке получить переменную через @@, которая была предназначена для реальной переменной класса.

class Bar
  @class_var = [42]
  class << self
    attr_accessor :class_var
  end
  def biz
    self.class.class_var
  end
  def baz
    @@class_var
  end
end
p Bar.new.biz # self.class. is kinda a way to emulate the reference from outside
p Bar.new.baz # and exception, because you don't really have a class variable defined yet!