2012-05-23 4 views
2

뭔가 할 수 있지만 가능한지 확실하지 않습니다. 어떤 메소드가 호출되었지만 정의되지 않은 경우에 "일반 메소드"또는 "기본 메소드"를 사용하려고합니다.일반 메소드/Ruby의 기본 메소드 (일부 메소드가 정의되지 않은 경우)

n = XYZ.new 
n.a 
n.b 
n.c 

당신이 난, 볼 수 있듯이 :

class XYZ 

    def a 
     #... 
    end 

    def b 
     #... 
    end 
end 

클래스 XYZ의 예 :이 클래스는

: 내 지점을 이해할 수 있도록이 간단한 예입니다 정의되지 않은 메소드 "c"를 호출하면 오류가 발생합니다. 클래스 XYZ에서 뭔가를 할 수 있나요? 누군가 정의되지 않은 메서드를 호출하면 메서드의 이름을 얻고 메서드의 이름을 기준으로 작업을 수행 할 수 있습니까? 그리고 다른 언어 (컴파일러를 만들지 않음)에서 가능합니까? 이것이 가능하다면 어떻게 부름을 받는가?

답변

4

사용 method_missing :

class XYZ 
    def a; end 
    def b; end 

    def method_missing(name, *args) 
    "Called #{name} with args: #{args}" 
    end 
end 

XYZ.new.C#=> "Called c" 

또한 respond_to_missing?을 정의해야합니다은 respond_to?가 1.9.2+에 더 좋은 일을 얻을 수 있습니다. read more about respond_to?/respond_to_missing? when using method_missing해야합니다.

이 방법은 메타 프로그래밍으로 간주됩니다. 일반적으로 함수를 호출하는 방식 때문에 컴파일 된 언어에서는 가능하지 않습니다.

3

호출 된 method_missing. 객체에 정의되지 않은 메소드를 호출하면 ruby가 호출을 method_missing 메소드로 리디렉션하여 오류를 발생시킵니다. 지금

class XYZ 
    def method_missing(method, *args, &blck) 
    puts "called #{method} with arguments #{args.join(',')}" 
    end 
end 

을 대신 오류 당신은 당신의 콘솔 출력을 얻을 것이다 :

당신은이 작업을 수행 할 수 있습니다.

관련 문제