为什么我在这个代码中得到一个系统堆栈错误


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 对象。如果你有运气,请为所有人发布结果。

有趣的问题!

相关内容

最新更新