수색…


매개 변수

매개 변수 세부
방법 위의 예에서는 :say_moo 라는 심볼의 이름입니다.
* args 인수가이 메소드에 전달되었습니다. 임의의 숫자 일 수도 있고 없어도됩니다.
&블록 이 메소드의 블록은 do 블록이거나 { } 묶인 블록 일 수 있습니다.

비고

이 함수의 맨 아래에있는 super를 항상 호출하십시오. 이렇게하면 무언가가 호출되고 오류가 발생하지 않을 때 자동 오류가 저장됩니다.

예를 들어,이 method_missing은 문제를 일으킬 것입니다 :

class Animal
  def method_missing(method, *args, &block)
    say, speak = method.to_s.split("_")
    if say == "say"
      speak
    end
  end
end

=> Animal.new.foobar
=> nil # This should really be raising an error

method_missing 은 적절한 경우 사용할 수있는 좋은 도구이지만 고려해야 할 두 가지 비용이 있습니다. 첫째, method_missing 은 덜 효율적입니다 - 루비는이 접근 방식으로 되돌아 가기 전에 클래스와 모든 조상을 검색해야합니다. 이 성능 저하는 단순한 경우에 사소한 것일 수 있지만 합산 될 수 있습니다. 두 번째로,이 프로그램은 구현이 안전하고 악의적 인 입력, 예상치 못한 입력 등을 적절히 처리하도록하는 책임이있는 강력한 권한을 가진 메타 프로그래밍의 한 형태입니다.

respond_to_missing? 도 재정의해야 respond_to_missing? 이렇게 :

class Animal
  def respond_to_missing?(method, include_private = false)
    method.to_s.start_with?("say_") || super
  end
end

=> Animal.new.respond_to?(:say_moo) # => true

정의되지 않은 메소드 호출 호출하기

class Animal
  def method_missing(method, *args, &block)
    "Cannot call #{method} on Animal"
  end
end

=> Animal.new.say_moo 
> "Cannot call say_moo on Animal"

누락 된 메서드 사용

class Animal
  def method_missing(method, *args, &block)
    say, speak = method.to_s.split("_")
    if say == "say"
      speak
    else
      super
    end
  end
end

=> a = Animal.new
=> a.say_moo
=> "moo"
=> a.shout_moo
=> NoMethodError: undefined method `shout_moo'

블록과 함께 사용

class Animal
  def method_missing(method, *args, &block)
    if method.to_s == 'say'
      block.call
    else
      super
    end
  end
end

 => Animal.new.say{ 'moo' }
 => "moo" 

매개 변수와 함께 사용

class Animal
  def method_missing(method, *args, &block)
    say, speak = method.to_s.split("_")
    if say == "say" && speak
      return speak.upcase if args.first == "shout"
      speak
    else
      super
    end
  end
end

=> Animal.new.say_moo
=> "moo" 
=> Animal.new.say_moo("shout")
=> "MOO" 


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow