Я пытаюсь понять эту функцию.
Я вижу, что атрибут и тип передаются методу opal
().
Тогда type_name
принимает значение от type
, пока type
равно Symbol
или String
. В противном случае метод name
вызывается на type
. Я полагаю, что метод name
похож на метод class
, чтобы получить класс аргумента type
.
После self.class_eval
Я в некотором роде потерян, но, думаю, это определяет, может быть, блок кода, добавляемый в класс, на который ссылается self
Как это работает, я не уверен, хотя.
Буду признателен, если кто-нибудь сможет объяснить, что происходит после self.class_eval << DEF
.
def opal(attr, type)
self.ds "#{attr}_id"
type_name = (type.is_a?(Symbol) || type.is_a?(String)) ? type : type.name
self.class_eval <<DEF
def #{attr}
if defined?(@#{attr})
@#{attr}
else
@#{attr} = if self.#{attr}_id
#{type_name}.get(self.#{attr}_id)
else
nil
end
end
end
def #{attr}=(value)
self.#{attr}_id = value.key
@#{attr} = value
end
DEF
end