Лучший способ установить значение по умолчанию для свойства без 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!