Ruby: 基于模型属性的元编程方法
Ruby: metaprogramming methods based in model attribute
我正在尝试根据其顺序属性中的值向 class 公开一些方法,这可能类似于 ['top', 'bottom', 'right', 'lower-right']
.
首先,我的 class 从该数组中删除任何响应空白的内容,如下所示:
def order
order.split(' ').delete_if do |o|
send(o).blank? if respond_to? o
end
end
之后,我想"expose"top
(举个例子)作为class的一个方法。我在 initialize
方法中尝试过这样的事情:
order.each do |o|
V1_ATTRIBUTES << o.to_sym
define_method(o) do |a|
send(a).blank? ? '' : send(a)
end
end
但是当 class 没有实例化时,o
没有定义,a la:
<NameError: undefined local variable or method `o' for #<Class:#<APIDocument:0x007fb8123609f8>>>
有人成功地获得了这个结果吗?
注意:我知道允许用户编写实例方法名称不是很好的做法,但在这种情况下,安全性和破损不是问题。
您可以定义单例方法(每个对象方法)。
def order
orders.split(' ').map{|o| send(o)}.compact.each do |o|
singleton_class.send(:define_method, o) do
send(o).to_s
end
end
end
但是如您所见,这只会弄乱您的代码。所以不要滥用元编程,明智地使用它。
我正在尝试根据其顺序属性中的值向 class 公开一些方法,这可能类似于 ['top', 'bottom', 'right', 'lower-right']
.
首先,我的 class 从该数组中删除任何响应空白的内容,如下所示:
def order
order.split(' ').delete_if do |o|
send(o).blank? if respond_to? o
end
end
之后,我想"expose"top
(举个例子)作为class的一个方法。我在 initialize
方法中尝试过这样的事情:
order.each do |o|
V1_ATTRIBUTES << o.to_sym
define_method(o) do |a|
send(a).blank? ? '' : send(a)
end
end
但是当 class 没有实例化时,o
没有定义,a la:
<NameError: undefined local variable or method `o' for #<Class:#<APIDocument:0x007fb8123609f8>>>
有人成功地获得了这个结果吗?
注意:我知道允许用户编写实例方法名称不是很好的做法,但在这种情况下,安全性和破损不是问题。
您可以定义单例方法(每个对象方法)。
def order
orders.split(' ').map{|o| send(o)}.compact.each do |o|
singleton_class.send(:define_method, o) do
send(o).to_s
end
end
end
但是如您所见,这只会弄乱您的代码。所以不要滥用元编程,明智地使用它。