Problem
Imagine you have a public gem and it has a Point
class defined as following
1
2
3
4
5
6
7
8
9
10
class Point
def initialize(x, y)
@x = x
@y = y
end
def print
"x: #{@x} and y: #{y}"
end
end
Its easy to get an instance of Point
class. You just pass positional argument - Point.new(5,7)
But lest say now you want to provide keyword arguments support. So you rewrite the initialize method.
1
2
3
4
def initialize(x:, y:)
@x = x
@y = y
end
You have just made a breaking change. All of the users of your gem who have been initializing Point
with positional argument will now get error.
So how do you solve this problem? All we know is that both
Point.new(5,7)
and Point.new(x: 5, y: 7)
should work.
Solution
1
2
3
4
5
def initialize(_x=nil, _y=nil, x: _x, y: _y)
x && y or raise ArgumentError, "Must supply x and y coordinates"
@x = x
@y = y
end