metaprogramming/define_method.rb

tests/_examples/metaprogramming/define_method.rb in the metorex repository.

# define_method - dynamically define methods on a class

# Define a method on a class using define_method called on the class
class Greeter
end

Greeter.define_method(:hello) { |name| "Hello, #{name}!" }

g = Greeter.new
puts g.hello("World")

# define_method inside a class body
class Calculator
  define_method(:double) { |n| n * 2 }
  define_method(:triple) { |n| n * 3 }
end

calc = Calculator.new
puts calc.double(5)
puts calc.triple(4)

# define_method with no parameters
class Greeter2
  define_method(:greet) { "Hi there!" }
end

g2 = Greeter2.new
puts g2.greet

# Dynamically define methods using a loop
class NumberMethods
end

["zero", "one", "two"].each do |word|
  NumberMethods.define_method(word) { word }
end

nm = NumberMethods.new
puts nm.zero
puts nm.one
puts nm.two

# respond_to? reflects dynamically defined methods
puts Greeter.new.respond_to?("hello")

Output:

Hello, World!
10
12
Hi there!
zero
one
two
true