2016-06-08 10 views
1

내가 본 것들에 유사한 방법을 정의합니다.는 방법이 <code>create_toto</code>, <code>create_tata</code> 및 <code>create_titi</code> 다른 곳에서 정의</p> <pre><code>[:toto, :tata, :titi].each do |kind| if "create_#{kind}" do something end end </code></pre> <p>처럼 한 번

메소드 정의로 할 수 있는지 궁금합니다. 같은 방법으로 수행하는 end_{something}이라는 여러 메서드가 있는데 위와 같은 메커니즘을 사용하여 하나의 그룹으로 그룹화 할 수 있는지 알고 싶습니다.

+0

나에게 유효한 루비처럼 보이지 않는다. 당신이 무엇을하고 싶은지 확실하지 않기 때문에 (당신이 아무것도하지 않는 것처럼 위의 "같은 메커니즘"을 사용할 수는 없기 때문에) 이것을 보았던 곳으로 다시 체크하거나 아마도 링크를 해줄 수 있습니까? 나는 * 당신이 루비가 할 수있는 무언가 인 루프에서 매우 유사한 메소드들을 정의하고 싶다고 생각한다. 그러나 당신의 예제와 같은 것에 관한 유일한 것은 첫 번째 라인입니다. . . 그냥 루프 정의입니다. –

+0

@NeilSlater 실제로 작업 프로그램이고이 컴퓨터에 없기 때문에 링크 할 수 없습니다. "동일한 메커니즘"이 의미하는 바는 각 루프를 다른 종류로 대체하고 좋은 함수를 호출하는 "create_ {kind}"입니다. 나는 'def end_ {kind}'와 어딘가에 kind = [: titi, : toto] 같은 것을 가질 수 있을지 궁금해하고있었습니다. 루비에서 그렇게 할 수 있다면 – user3314570

답변

3

표현식 if "create_#{kind}"이 항상 true를 반환하는 것을 확인하면 메서드가 정의되어 있는지 확인하는 defined?("create_#{kind}")을 의미 할 수 있습니다. 또한 동적 방법을 정의 할 수 있습니다

def method_missing(method_name, *arguments, &block) 
    method = method_name.to_s 

    case method 
    when 'create_toto' 
    #do somthing 
    when 'create_tata' 
    #do somthing 
    when 'create_titi' 
    #do somthing 
    else 
    super 
    end 
end 

:

당신은 'method_missing'방법을 사용할 수 있습니다

[:toto, :tata, :titi].each do |kind| 
    define_method "create_#{kind}" do 
    #do something 
    end 
end 
+0

고맙습니다. 작동합니다! – user3314570

관련 문제