2012-04-28 2 views
0
module CallableDict 
    def method_missing method 
    puts x["#{method}"] 
    end 
end 

위의 코드는 내 모듈이며, 해시 키를 호출 가능하게 만듭니다. 언제 ...하지만 나는 다음과 같은 얻을왜 SystemStackError가 발생합니까?

require 'callabledict' 
x = {"foo" => "ruby"} 
x.extend CallableDict 
x.foo 

...

SystemStackError: stack level too deep 
    from /Users/Solomon/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/workspace.rb:80 
Maybe IRB bug! 

왜 실행? HP는 이것을 고칠 수 있습니까? 루비 오른쪽에서 변수로 x을 볼 수없는 것처럼

method_missing의 구현에서
module CallableDict 
    def method_missing method 
    puts self["#{method}"] 
    end 
end 
+1

을 내가 그 또한 또 다시 X를 호출 한 이후,'재귀 호출이다 method_missing''에서 x'를 호출 같아요. – Peterdk

답변

3

실제로 xself 그래서이처럼 다시 작성할 수있다 범위. 인터프리터가 x["#{method}"]을 볼 때 해시 또는 x이라는 메서드에서 반환 된 다른 개체로 인덱싱하고 있다고 생각합니다. x이라는 메서드가 없으므로 Ruby는 method_missing을 호출합니다.이 메서드는 다시 한번 자체를 호출하여 Ruby가 스택 오버플로로 실행될 때까지이 프로세스를 반복합니다.

수정 사항은 간단합니다. @nash 위에서 언급 한 바와 같이, 당신은 이름x은 의미가 없다, 때문에 method_missing에, selfx를 교체해야하지만 이름self는 (C 측면에서, 그들은 같은 포인터입니다) 동일 참조입니다. 또한, method_missing의 구현이를 수행하여 코드를 읽기 쉽게 만들 수 :

puts self[method.to_s] 
+0

+1,'x'는 누락되었습니다.'method'가 아닙니다. –

0

, x는, 메소드 이름으로 처리됩니다

관련 문제