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 |