给出这里的简单示例:
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。