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 |