문제

method_missing

*obj.method_missing(기호 h args i)→other_obj

에 의해 호출됩 루비 때 obj 송 메시지에 그것을 처리할 수 없습니다.기호 의 상징이라는 방법,그리고 args 은 모든 인수했다 전달됩니다.아래 예제 클래스를 만들고 로마의 반응하는 하는 방법으로 이름으로 구성된 로마 숫자를 반환 해당 정수의 값이다.보 의 일반적인 사용을 method_missing 프록시를 구현하,delegators 고 업자.

class Roman
  def roman_to_int(str)
    # ...
  end
  def method_missing(method_id)
    str = method_id.id2name
    roman_to_int(str)
  end
end
r = Roman.new
r.iv ! 4
r.xxiii ! 23
r.mm ! 2000

나는 그냥 들어에 대한 방법-누락 갔에 대해 자세히 알아보세요 프로그래밍 Ruby 그러나 위의 설명에서 인용 책이 있습니다.는 누구나 쉽게 설명은?더 구체적으로,방법-누락만을 사용하여 인터프리터 또는 이제까지 필요한 전화를 직접 프로그램에서(가정 난 그냥 글 web apps,반대로 쓰는 코드에 대한 NASA)?

도움이 되었습니까?

해결책

루비하지 않는 모든 유형의 집행,그리고 마찬가지로 하지 않는 어떤를 확인하여 어떤 방법 개체 스크립트가 처음 분석을 할 수 있기 때문에,동적으로 변경된 응용 프로그램으로 실행됩니다.

What method_missing 않습니다,당신이 당신을 가로채 통화를 처리하는 방법이 존재하지 않는 특정 개체입니다.이 제공합 under-the-hood 전력 뒤에 거의 모든 DSL(도메인 특정 언어로)작성 Ruby.

에서 예제의 경우,모든 하나의'r.iv','r.mm',그리고 실제로 메소드 호출을 로마의 객체입니다.물론,는 가지고 있지 않습니다.'iv'또는'mm'방법,그래서 그 대신 넘어가 method_missing 가져오는 메소드의 이름을 불렀다,뿐만 아니라 어떤 인수가 전달된다.

method_missing 로 변환하는 방법에서 이름을 상징하는 문자열 및 분석은 그것으로 로마의 번호를 반환하는 출력으로 정수입니다.

다른 팁

루비를 방법이있는 것으로 생각하지 않는 것이 가장 좋습니다. Ruby "Method"를 호출 할 때 실제로 해당 인스턴스 (또는 클래스)에 메시지를 보내고 메시지에 대한 핸들러를 정의한 경우 값을 처리하고 반환하는 데 사용됩니다.

그래서 method_missing 루비가 적절한 핸들러를 찾을 수 없을 때마다 호출되는 특별한 정의입니다. 당신은 또한 그것을 a처럼 생각할 수 있습니다 * 방법.

기본적으로 어떤 방법에도 일치하지 않는 메시지의 집단입니다. 동적 파인더의 활성 레코드에서 광범위하게 사용됩니다. 다음과 같은 글을 쓸 수 있습니다.

SomeModel.find_by_name_and_number(a_name, a_number)

모델에는 해당 Find_by에 대한 코드가 포함되어 있지 않으므로 Method_missing이 호출됩니다. 그렇지 않으면 메소드를 찾을 수없는 오류가 발생합니다.

로마 예제에서 당신은 그것을 제공하는 방법을 명시 적으로 정의하지 않고 클래스의 기능을 확장 할 수있는 방법을 보여줍니다.

R.IV는 방법이 아닙니다 method_missing 그것을 잡고 전화합니다 roman_to_int 메소드 ID "IV"에서

문서가 표시된 것처럼 프록시, 대표 및 전달자와 같은 다른 곳에서 인식되지 않은 방법을 처리하려는 경우에도 유용합니다.

당신은 전화하지 않습니다 "method_missing"(통역사가 그것을 부릅니다). 오히려, 당신은 정의하다 더 유연하게 만들고 싶은 클래스의 경우 (무시하고). 다른 의견에서 언급했듯이, 통역사는 귀하의 버전을 호출합니다. method_missing 클래스 (또는 인스턴스)가 ( "명시 적으로"?)가 요청 된 메소드를 정의하지 않는 경우. 이를 통해 ERSATZ 메소드/메시지 이름을 기반으로 무언가를 만들 수 있습니다.

Java에서 "반사"프로그래밍을 한 적이 있습니까? 이 메소드를 사용하면 반사를 통해 액세스 할 클래스가 메소드 이름의 문자열 (실례합니다. 즉시 구현.

동적 프로그래밍은 반사에 대한 일종의 "일대일"입니다.

웹 앱을 언급하기 때문에 Ruby on Rails에 익숙하다고 생각합니다. 방법의 좋은 예 method_missing 사용될 수 있습니다 find_by_<whatever> 사용 가능한 방법. 그 방법 중 어느 것도 실제로 존재하지 않습니다! 그들은 런타임 동안 합성됩니다. 이 모든 마법은 루비가 존재하지 않는 방법의 호출을 가로 채기 때문에 발생합니다.

method_missing의 그것 및 기타 사용에 대해 더 많이 읽을 수 있습니다. 여기.

ActiveRecord 사용 method_missing find_by 메소드를 정의합니다. 하지만 그때부터, method_missing 기본적으로 마지막 수단 방법이며, 이것은 심각한 성능 병목 현상 일 수 있습니다. 내가 발견 한 것은 ActiveRecord가 새로운 Finder 메소드를 클래스 메소드로 정의하여 더 멋진 메타 프로 그램을 수행한다는 것입니다 !! 따라서 동일한 파인더 방법에 대한 추가 호출은 method_missing 이제 클래스 방법이기 때문입니다. Base.rb의 실제 코드 스 니펫에 대한 자세한 내용은 클릭하십시오. 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top