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.

Checking Class or Module Membership
CodeExpectedActual
def send_as_package(obj)
  if obj.respond_to? :package
    packaged = obj.package
  else
    if $DEBUG
      $stderr.puts "Not sure how to package a #{obj.class}."
      $stderr.puts 'Trying generic packager.'
    end
    package = Package.new(obj)
  end
  send(package)
end
def multiply_precisely(a, b)
  if a.is_a? Float or b.is_a? Float
    raise ArgumentError, "I can't do precise multiplication with floats."
  end
  a * b
end
multiply_precisely(4, 5)
20 20
multiply_precisely(4.0, 5)
ArgumentError: I can't do precise multiplication with floats.
...
ArgumentError: I can't do precise multiplication with floats.
	from (irb):15:in `multiply_precisely'
	from (irb):20
def append_to_self(x)
  unless x.respond_to? :<<
    raise ArgumentError, "This object doesn't support the left-shift operator."
  end
  if x.is_a? Numeric
    raise ArgumentError, 
	"The left-shift operator for this object doesn't do an append."
  end
  x << x
end 
append_to_self('abc')
"abcabc" "abcabc"
append_to_self([1, 2, 3])
[1, 2, 3, [...]] [1, 2, 3, [...]]
append_to_self({1 => 2})
ArgumentError: This object doesn't support the left-shift operator.
...
ArgumentError: This object doesn't support the left-shift operator.
	from (irb):23:in `append_to_self'
	from (irb):33
append_to_self(5)
ArgumentError: The left-shift operator for this object doesn't do an append.
...
ArgumentError: The left-shift operator for this object doesn't do an append.
	from (irb):26:in `append_to_self'
	from (irb):34
5 << 5
160 160
module ShiftMeansAppend
  def <<(x)
  end
end
class String
  include ShiftMeansAppend
end
class Array
  include ShiftMeansAppend
end
def append_to_self(x)
  unless x.is_a? ShiftMeansAppend
    raise ArgumentError, "I can't trust this object's left-shift operator."
  end
  x << x
end 
append_to_self 4
ArgumentError: I can't trust this object's left-shift operator.
...
ArgumentError: I can't trust this object's left-shift operator.
	from (irb):48:in `append_to_self'
	from (irb):52
append_to_self '4'
"44" "44"