Я играл с Ruby, и я написал следующий код:Включить модуль для определения метода динамического учащегося
module IdAndNameRedefine
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def use_id_and_name_from_module(use_attribute)
class_eval <<CODE
def id_and_name
"\#{id}-\#{#{use_attribute}.downcase}"
end
CODE
end
end
end
class Model
include IdAndNameRedefine
attr_reader :id, :name1, :name2
def initialize(id, name1, name2)
@id = id
@name1 = name1
@name2 = name2
end
def id_and_name
"#{id}-#{name1}"
end
use_id_and_name_from_module :name2
end
model = Model.new(1, "TesT", "Test number TWO")
puts model.id_and_name
Когда я пытаюсь сделать здесь, чтобы переопределить метод класса id_and_name
в классе Модель со способом, динамически вставленным модулем IdAndNameRedefine
. Когда этот модуль включен, он создает «статический» метод (действительно, метод класса Model.class, как я его понимаю), и когда вызывается use_id_and_name_from_module
, он создает метод класса в модели, который переопределяет id_and_name
для использования любого атрибута Модель спросила.
Мой вопрос: Есть ли лучший способ сделать это, или это «правильный» способ сделать это? Я не совсем уверен, нравится ли мне класс_eval с строкой, где мне нужно избегать значений и т. Д., Чтобы сделать эту работу.
Спасибо! Я думал, что это выглядит глупо, но я не мог понять, как это сделать. Я действительно верю, что я тоже пробовал define_method, но в этом вопросе я использовал 'use_id_and_name_from_module'-вызов в верхней части определения класса, поэтому он не работал (перезаписывается декларацией позже в классе, я думаю). Просто из любопытства; Есть ли способ разместить 'use_id_and_name_from_module' в верхней части класса и убедиться, что он не может быть переопределен в последующих объявлениях? –
Вы можете переопределить метод_added и повторно добавить свою версию всякий раз, когда кто-то пытается ее заменить. Кажется немного запутанным. Лучше просто не переопределять метод в первую очередь. – Chuck