methods/undefined_names_reach_method_missing.rb

tests/_examples/methods/undefined_names_reach_method_missing.rb in the metorex repository.

class Blank
  undef_method :<=>
  undef_method :==

  def method_missing(name, *arguments)
    [:missing, name, *arguments]
  end

  def respond_to_missing?(*)
    true
  end
end

p Blank.new <=> 1
p Blank.new == 2
p Blank.new.__send__(:<=>, 3)

class Wrapper
  def method_missing(name, *arguments)
    [:missing, name, *arguments]
  end
end
p Wrapper.new < 4

module AnyStandardError
  def self.===(exception)
    exception.is_a?(StandardError)
  end
end

begin
  raise ArgumentError, "custom match"
rescue AnyStandardError => error
  p error.message
end

p([Blank.new, Blank.new].sort) rescue p $!.class

class Quiet
  undef_method :inspect

  def method_missing(name, *arguments)
    [:missing, name]
  end
end
p Quiet.new.inspect

class Plain
  undef_method :hash
end
Plain.new.hash rescue p $!.message

class Ordered
  def <=>(other)
    0
  end

  def method_missing(name, *arguments)
    [:missing, name, *arguments]
  end
end
p Ordered.new < 5

Output:

[:missing, :<=>, 1]
[:missing, :==, 2]
[:missing, :<=>, 3]
[:missing, :<, 4]
"custom match"
NoMethodError
[:missing, :inspect]
"undefined method 'hash' for an instance of Plain"
[:missing, :<, 5]