Search code examples
arraysrubyperfect-square

How to square each element of an array in Array class in Ruby?


Part of my code is as follows:

class Array
  def square!
    self.map {|num| num ** 2}
    self
  end
end

When I call:

[1,2,3].square!

I expect to get [1,4,9], but instead I get [1,2,3]. Why is this the case? When I call:

[1,2,3].map {|num| num ** 2}

outside of the class method, I get the correct answer.


Solution

  • You have to use Array#map!, not Array#map.

    Array#map -> Invokes the given block once for each element of self.Creates a new array containing the values returned by the block.

    Array#map! -> Invokes the given block once for each element of self, replacing the element with the value returned by the block.

    class Array
      def square!
        self.map! {|num| num ** 2}
      end
    end
    
    [1,2,3].square! #=> [1, 4, 9]