programming-languageslanguage-featuresmethod-missing

Are there equivalents to Ruby's method_missing in other languages?


In Ruby, objects have a handy method called method_missing which allows one to handle method calls for methods that have not even been (explicitly) defined:

Invoked by Ruby when obj is sent a message it cannot handle. symbol is the symbol for the method called, and args are any arguments that were passed to it. By default, the interpreter raises an error when this method is called. However, it is possible to override the method to provide more dynamic behavior. The example below creates a class Roman, which responds to methods with names consisting of roman numerals, returning the corresponding integer values.

class Roman
 def romanToInt(str)
   # ...
 end
 def method_missing(methId)
   str = methId.id2name
   romanToInt(str)
 end
end

r = Roman.new
r.iv      #=> 4
r.xxiii   #=> 23
r.mm      #=> 2000

For example, Ruby on Rails uses this to allow calls to methods such as find_by_my_column_name.

My question is, what other languages support an equivalent to method_missing, and how do you implement the equivalent in your code?


Solution

  • Some use cases of method_missing can be implemented in Python using __getattr__ e.g.

    class Roman(object):
      def roman_to_int(self, roman):
        # implementation here
    
      def __getattr__(self, name):
        return self.roman_to_int(name)
    

    Then you can do:

    >>> r = Roman()
    >>> r.iv
    4