method_missing
is a powerful Ruby metaprogramming feature. It allows you to intercept and handle calls to undefined methods, providing dynamic behavior to your Ruby objects.
When you call a method on an object in Ruby, the interpreter searches for that method in the object's class and its ancestors. If the method is not found, Ruby invokes the method_missing
method instead of raising a NoMethodError
.
To use method_missing
, define it in your class as follows:
class MyClass
def method_missing(method_name, *arguments, &block)
# Your custom logic here
end
end
method_name
: The name of the called method (as a Symbol)*arguments
: An array of arguments passed to the method&block
: An optional block passed to the methodHere's an example demonstrating how to use method_missing
to create dynamic attribute accessors:
class DynamicPerson
def initialize(name, age)
@name = name
@age = age
end
def method_missing(method_name, *args, &block)
if method_name.to_s =~ /^get_(.+)$/
instance_variable_get("@#{$1}")
else
super
end
end
end
person = DynamicPerson.new("Alice", 30)
puts person.get_name # Output: Alice
puts person.get_age # Output: 30
In this example, method_missing
intercepts calls to methods starting with "get_" and returns the corresponding instance variable value.
super
in method_missing
for unhandled methods to maintain expected behavior.respond_to_missing?
alongside method_missing
for proper method introspection.method_missing
judiciously, as it can make code harder to understand and debug.method_missing
is slower than defined methods.method_missing
enables the creation of "ghost methods" - methods that don't exist in the class definition but appear to work when called. This technique is useful for creating flexible APIs or domain-specific languages (DSLs).
class CommandExecutor
def method_missing(command, *args, &block)
puts "Executing command: #{command} with arguments: #{args.join(', ')}"
# Actual command execution logic would go here
end
end
executor = CommandExecutor.new
executor.start_server("localhost", 8080)
executor.send_email("user@example.com", "Hello!")
This example demonstrates how method_missing
can be used to create a flexible command execution interface.
To further enhance your understanding of Ruby's metaprogramming capabilities, explore these related topics:
By mastering method_missing
, you'll unlock powerful metaprogramming techniques in Ruby, enabling more flexible and dynamic code structures.