class X
class << self
def attr_string arg
eval("def #{arg}; return #{arg.to_s}; end")
end
end
end
是我正在使用的代码。我试图把它变成一个类宏,比如 attr_accessor。当我打电话
foo = 50
X.attr_string :foo
X.foo
我得到一个SystemStackError
. 为什么是这样?
class X
def attr_string arg
(class << self; self; end).class_eval do
define_method arg do
arg
end
end
end
end
或小清洁工
class X
def self.attr_string arg
self.class.instance_eval do
define_method(arg) { arg.to_s }
end
end
end
无限递归就可以了。
选项1(使用类变量):
@@foo = 50
class X
def X.attr_string arg
eval("def X.#{arg.to_s}; return @@#{arg.to_s}; end")
end
end
X.attr_string :foo
X.foo
选项2(在定义方法时指定值):
class X
def X.attr_string arg, val
eval("def X.#{arg.to_s}; #{val}; end")
end
end
X.attr_string :foo, 50
X.foo
我想return foo
尝试无限地再次运行 foo 方法。但是,即使您将变量命名为 foo1 并返回 foo1,它也不会发现 foo1 作为类变量,因为它已经失去了作用域。
您可以尝试将值包装在 lambda 中或编组 foo 对象。如果你有运气,请把结果发布给所有人。
有趣的问题!