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 foofoo メソッドを無限に再実行しようとしていると思います。ただし、変数に foo1 という名前を付けて foo1 を返したとしても、スコープが失われているため、foo1 はクラス変数として検出されません。
値をラムダでラップするか、foo オブジェクトをマーシャリングすることができます。運が良ければ、全員の結果を投稿してください。
面白い問題!