我正在尝试使用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
我在这里要做的是使用
IdAndNameRedefine
模块动态插入一个方法来覆盖Model
类中的id_and_name
类方法。当包含该模块时,它会创建一个“静态”方法(实际上是Model.class的类方法,据我所知),并且当调用use_id_and_name_from_module
时,它会在Model中创建一个类方法,该方法重新定义了id_and_name
以使用Model请求的任何属性。我的问题是... 有没有更好的方法来完成这个任务,或者这是正确的方式?我不确定是否喜欢
class_eval
的字符串格式,需要转义值等才能使其正常工作。
define_method
,但那时我在类定义的顶部调用了use_id_and_name_from_module
,因此它没有起作用(我猜是被后面的声明覆盖了)。只是出于好奇,有没有办法将use_id_and_name_from_module
放在类的顶部,并确保它不能在后面的声明中被覆盖? - Thorbjørn Hermansen