【发布时间】:2012-09-29 07:29:26
【问题描述】:
这里举个简单的例子:
class Base
@tag = nil
def self.tag(v = nil)
return @tag unless v
@tag = v
end
end
class A < Base
tag :A
end
class B < Base
tag :B
end
class C < Base; end
puts "A: #{A.tag}"
puts "B: #{B.tag}"
puts "A: #{A.tag}"
puts "C: #{C.tag}"
按预期工作
A: A
B: B
A: A
C:
我想创建一个模块,该模块将扩展 base 以提供相同的功能,但具有类指定的所有标记信息。例如。
module Tester
def add_ident(v); ....; end
end
class Base
extend Tester
add_ident :tag
end
我发现我可以通过直接评估来做到这一点,所以:
def add_ident(v)
v = v.to_s
eval "def self.#{v}(t = nil); return @#{v} unless t; @#{v} = t; end"
end
但我真的不喜欢在任何语言中使用 eval 字符串。
有没有一种方法可以让我在不使用 eval 的情况下获得此功能?我已经完成了我能想到的 define_method 和 instance_variable_get/set 的所有组合,但我无法让它工作。
没有 Rails 的 Ruby 1.9。
【问题讨论】:
标签: ruby metaprogramming