Chapter 4 - Initializing instances

Exercise 1: Initializing rectangles

Remember our Rectangle class from previous chapters? Your next task is to add an initialize method that takes two parameters: a width and a height. Assign those values to the width and height attributes of the new instance. You should utilize the existing validation in the attribute writer methods, so that an error is raised if a negative value is passed.

Solution

class Rectangle
  attr_reader :width, :height

  # New code here!
  def initialize(width, height)
    self.width = width
    self.height = height
  end

  def width=(value)
    if value < 0
      raise "Width can't be negative!"
    end
    @width = value
  end

  def height=(value)
    if value < 0
      raise "Height can't be negative!"
    end
    @height = value
  end

  def area
    width * height
  end
end

rectangle = Rectangle.new(2, 4)
puts rectangle.area # Output: 8

Extra Credit: For bonus points, revise the initialize method to take keyword arguments instead of positional arguments!

class Rectangle
  # ...
  def initialize(width:, height:)
    self.width = width
    self.height = height
  end
  # ...
end

rectangle = Rectangle.new(width: 2, height: 4)
puts rectangle.area # Output: 8