 
 This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Avoiding Boilerplate Code with Metaprogramming | ||
|---|---|---|
| Code | Expected | Actual | 
| class Fetcher
  def fetch(how_many)
    puts "Fetching #{how_many ? how_many : "all"}."
  end
  def fetch_one
    fetch(1)
  end
  def fetch_ten
   fetch(10)
  end
  def fetch_all
    fetch(nil)
  end
end
class GeneratedFetcher
  def fetch(how_many)
    puts "Fetching #{how_many ? how_many : "all"}."
  end
  [['one', 1], ['ten', 10], ['all', nil]].each do |name, number|
    define_method("fetch_#{name}") do
      fetch(number)
    end
  end
end
GeneratedFetcher.instance_methods - Object.instance_methods | ["fetch_one", "fetch", "fetch_ten", "fetch_all"] | ["fetch_one", "fetch", "fetch_ten", "fetch_all"] | 
| GeneratedFetcher.new.fetch_one | Fetching 1. | Fetching 1. | 
| GeneratedFetcher.new.fetch_all | Fetching all. | Fetching all. | 
| class Numeric
  [['add', '+'], ['subtract', '-'], ['multiply', '*',],
   ['divide', '/']].each do |method, operator|
    define_method("#{method}_2") do
      method(operator).call(2)
    end
  end
end
4.add_2 | 6 | 6 | 
| 10.divide_2 | 5 | 5 | 
| define_method 'call_with_args' do |*args, &block|
  block.call(*args)
end
call_with_args(1, 2) { |n1, n2| n1 + n2 } | 3 | Error! (Exception?) Here's stdout:
SyntaxError: compile error
(irb):38: parse error, unexpected ',', expecting '|'
define_method 'call_with_args' do |*args, &block|
                                         ^
(irb):40: parse error, unexpected kEND, expecting $
	from (irb):40
NoMethodError: undefined method `call_with_args' for main:Object
	from (irb):41
 | 
| call_with_args 'mammoth' { |x| x.upcase } | "MAMMOTH" | Error! (Exception?) Here's stdout:
SyntaxError: compile error
(irb):42: parse error, unexpected '{', expecting $
call_with_args 'mammoth' { |x| x.upcase }
                          ^
	from (irb):42
 |