Ich spiele gerade mit Ruby herum und habe den folgenden Code geschrieben:
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
Wenn ich hier versuche, die Klassenmethode zu überschreiben id_and_name
in der Klasse Model mit einer Methode, die dynamisch von der IdAndNameRedefine
-Modul. Wenn dieses Modul eingebunden wird, erstellt es eine "statische" Methode (eigentlich eine Klassenmethode der Model.class, wie ich sie verstehe) und wenn use_id_and_name_from_module
aufgerufen wird, wird eine Klassenmethode in Model erstellt, die die id_and_name
das gewünschte Attribut von Model zu verwenden.
Meine Frage ist Gibt es eine bessere Möglichkeit, dies zu tun, oder ist dies die "richtige" Art und Weise, dies zu tun? Ich bin nicht wirklich sicher, ob ich wie die class_eval mit nimmt eine Zeichenfolge, wo ich Werte usw. zu entkommen, um diese Arbeit zu machen müssen.