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.
| Creating an Abstract Method | ||
|---|---|---|
| Code | Expected | Actual |
class Shape2D
def area
raise NotImplementedError.
new("#{self.class.name}#area is an abstract method.")
end
end
Shape2D.new.area |
NotImplementedError: Shape2D#area is an abstract method. ... |
NotImplementedError: Shape2D#area is an abstract method. from (irb):4:in `area' from (irb):7 |
class Square < Shape2D
def initialize(length)
@length = length
end
def area
@length ** 2
end
end
Square.new(10).area |
100 | 100 |
class Shape2D
def initialize
raise NotImplementedError.
new("#{self.class.name} is an abstract class.")
end
end
Shape2D.new |
NotImplementedError: Shape2D is an abstract class. ... |
NotImplementedError: Shape2D is an abstract class. from (irb):20:in `initialize' from (irb):23 |
class Class
def abstract(*args)
args.each do |method_name|
define_method(method_name) do |*args|
if method_name == :initialize
msg = "#{self.class.name} is an abstract class."
else
msg = "#{self.class.name}##{method_name} is an abstract method."
end
raise NotImplementedError.new(msg)
end
end
end
end
class Animal
abstract :initialize, :move
end
Animal.new |
NotImplementedError: Animal is an abstract class. ... |
NotImplementedError: Animal is an abstract class. from (irb):33:in `initialize' from (irb):41 |
class Sponge < Animal
def initialize
@type = :Sponge
end
end
sponge = Sponge.new
sponge.move |
NotImplementedError: Sponge#move is an abstract method. ... |
NotImplementedError: Sponge#move is an abstract method. from (irb):33:in `move' from (irb):48 |
class Cheetah < Animal
def initialize
@type = :Cheetah
end
def move
"Running!"
end
end
Cheetah.new.move |
"Running!" | "Running!" |
class Sponge
def move
"Floating on ocean currents!"
end
end
sponge.move |
"Floating on ocean currents!" | "Floating on ocean currents!" |