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.
Responding to Calls to Undefined Methods | ||
---|---|---|
Code | Expected | Actual |
class MyClass def defined_method 'This method is defined.' end def method_missing(m, *args) "Sorry, I don't know about any #{m} method." end end o = MyClass.new o.defined_method |
"This method is defined." | "This method is defined." |
o.undefined_method |
"Sorry, I don't know about any undefined_method method." | "Sorry, I don't know about any undefined_method method." |
class Fixnum def method_missing(m, *args) if args.size > 0 raise ArgumentError.new("wrong number of arguments (#{args.size} for 0)") end match = /^plus_([0-9]+)$/.match(m.to_s) if match self + match.captures[0].to_i else raise NoMethodError. new("undefined method `#{m}' for #{inspect}:#{self.class}") end end end 4.plus_5 |
9 | 9 |
10.plus_0 |
10 | 10 |
-1.plus_2 |
1 | 1 |
100.plus_10000 |
10100 | 10100 |
20.send(:plus_25) |
45 | 45 |
100.minus_3 |
NoMethodError: undefined method `minus_3' for 100:Fixnum ... |
NoMethodError: undefined method `minus_3' for 100:Fixnum from (irb):22:in `method_missing' from (irb):31 |
100.plus_5(105) |
ArgumentError: wrong number of arguments (1 for 0) ... |
ArgumentError: wrong number of arguments (1 for 0) from (irb):15:in `method_missing' from (irb):32 |
class BackwardsString def initialize(s) @s = s end def method_missing(m, *args, &block) result = @s.send(m, *args, &block) result.respond_to?(:to_str) ? BackwardsString.new(result) : result end def to_s @s.reverse end def inspect to_s end end s = BackwardsString.new("I'm backwards.") |
.sdrawkcab m'I | .sdrawkcab m'I |
s.size |
14 | 14 |
s.upcase |
.SDRAWKCAB M'I | .SDRAWKCAB M'I |
s.reverse |
I'm backwards. | I'm backwards. |
s.no_such_method |
NoMethodError: undefined method `no_such_method' for "I'm backwards.":String ... |
NoMethodError: undefined method `no_such_method' for "I'm backwards.":String from (irb):38:in `send' from (irb):38:in `method_missing' from (irb):52 |
class Library < Array def add_book(author, title) self << [author, title] end def search_by_author(key) reject { |b| !match(b, 0, key) } end def search_by_author_or_title(key) reject { |b| !match(b, 0, key) && !match(b, 1, key) } end :private def match(b, index, key) b[index].index(key) != nil end end l = Library.new l.add_book("James Joyce", "Ulysses") l.add_book("James Joyce", "Finnegans Wake") l.add_book("John le Carre", "The Little Drummer Boy") l.add_book("John Rawls", "A Theory of Justice") l.search_by_author("John") |
[["John le Carre", "The Little Drummer Boy"], | [["John le Carre", "The Little Drummer Boy"], ["John Rawls", "A Theory of Justice"]] |
l.search_by_author_or_title("oy") |
[["James Joyce", "Ulysses"], ["James Joyce", "Finnegans Wake"], | [["James Joyce", "Ulysses"], ["James Joyce", "Finnegans Wake"], ["John le Carre", "The Little Drummer Boy"]] |
class Library def method_missing(m, *args) search_by_author_or_title(m.to_s) end end l.oy |
[["James Joyce", "Ulysses"], ["James Joyce", "Finnegans Wake"], | [["James Joyce", "Ulysses"], ["James Joyce", "Finnegans Wake"], ["John le Carre", "The Little Drummer Boy"]] |
l.Fin |
[["James Joyce", "Finnegans Wake"]] | [["James Joyce", "Finnegans Wake"]] |
l.Jo |
[["James Joyce", "Ulysses"], ["James Joyce", "Finnegans Wake"], | [["James Joyce", "Ulysses"], ["James Joyce", "Finnegans Wake"], ["John le Carre", "The Little Drummer Boy"], ["John Rawls", "A Theory of Justice"]] |
class StringFactory def StringFactory.method_missing(m, *args) return String.new(m.to_s, *args) end end StringFactory.a_string |
"a_string" | "a_string" |
StringFactory.another_string |
"another_string" | "another_string" |
StringFactory.superclass |
Object | Object |
25.respond_to? :plus_20 |
false | false |
class Fixnum def respond_to?(m) super or (m.to_s =~ /^plus_([0-9]+)$/) != nil end end 25.respond_to? :plus_20 |
true | true |
25.respond_to? :succ |
true | true |
25.respond_to? :minus_20 |
false | false |