1
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ます。どうしてこれなの?

4

2 に答える 2

0
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
于 2012-06-04T18:43:15.720 に答える
0

無限再帰がそれを行います。

オプション 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 foofoo メソッドを無限に再実行しようとしていると思います。ただし、変数に foo1 という名前を付けて foo1 を返したとしても、スコープが失われているため、foo1 はクラス変数として検出されません。

値をラムダでラップするか、foo オブジェクトをマーシャリングすることができます。運が良ければ、全員の結果を投稿してください。

面白い問題!

于 2012-06-04T18:44:30.247 に答える