2012-06-04 2 views
1
class X 
    class << self 
    def attr_string arg 
     eval("def #{arg}; return #{arg.to_s}; end") 
    end 
    end 
end 

내가 작업하는 코드는 무엇입니까? attr_accessor와 같은 클래스 매크로로 만들려고합니다. 전화 할 때이 코드에서 SystemStackError가 발생하는 이유는 무엇입니까?

foo = 50 
X.attr_string :foo 
X.foo 

나는 SystemStackError입니다. 왜 이런거야?

+0

'X.foo'는 무엇을 반환해야합니까? 귀하의 경우에는'foo'를 반환해야합니다 – fl00r

답변

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 
+0

X.foo는 50이 아니라 'foo'를 반환합니다. – Anil

+0

@Anil, 코드는 50이 아니라 foo (코드가 작동하는 경우) – fl00r

+0

루프를 지나쳤습니다. foo를 반환하려면 X를 호출 할 필요가 없습니다. 그가 foo에 50을 할당했다는 사실은 아마도 그가 50을 되 찾으려고한다는 것을 의미합니다. 오직 그와 그가 말할 수 있습니다. – Anil

0

무한 재귀가 그것을 할 것입니다.

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 

내가 다시 foo는 방법을 실행하는 return foo 시도를 추측 무한 :

옵션 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 . 그러나 변수 foo1의 이름을 지정하고 foo1을 반환하더라도 범위를 잃어 버렸기 때문에 foo1을 클래스 변수로 찾지는 못합니다.

값을 람다로 랩핑하거나 foo 객체를 마샬링하려고 할 수 있습니다. 운이 좋으면 모든 결과를 게시하십시오.

흥미로운 문제!

+0

아직도 나를 systemstackerr –

+0

나는 대답을 편집하고 그것을 테스트했습니다. 이게 당신이 시도한 것과 더 가깝습니까? – Anil

관련 문제