2010-01-25 3 views
3

니핏 1두 개의 Ruby 스 니펫의 차이점은 무엇입니까?

module A 
    def cm(m,ret) 
    class_eval do 
    define_method(m.to_sym) do 
     return ret 
    end 
    end 
    end 
end 

하고 2 조각은 이러한 모듈에 정의

module B 
    def cm(m,ret) 
    class_eval do 
     "def #{m} #{ret} end" 
    end 
    end 
end 

방법은 특정 값을 반환하는 클래스의 메소드를 생성하는데 사용되어야한다. 다음은 예입니다 :

class Whatever 
    extend A 
    cm("two",2) 
end 

이것은 2. 일이, 두 번째 조각의 코드가 작동하지 않습니다되어 돌아갑니다 2라는 이름의 메소드를 작성합니다. 어떤 아이디어? 나는 class_eval이 문자열을 가질 수 있다고 생각했다.

답변

5

class_eval은 문자열을 인수로 사용하지만 문자열을 블록의 함수에 전달했습니다.

이 대신보십시오 :

module B 
    def cm(m,ret) 
    class_eval("def #{m}() #{ret} end") 
    end 
end 
+0

나는 아직도 정의 자체가 잘못 보이는 생각합니다. "def # {m}; return # {ret}; end" – Jean

+2

@Jean : 표현식이 메소드의 마지막 표현식 일 때 return 키워드는 선택 사항입니다. end 키워드 앞에 또는 메소드 정의의 인수 목록 뒤에 종결자가 있습니다. 나는. 'def five() 5 end'는 유효한 문법입니다. 그러나 'def five 5 end'는 그렇지 않다. – sepp2k

관련 문제