Hello,
I was wondering about implementing sort/sort!. Basically, I have a Point
class, which contains x, y variables of a 2d Cartesian point. It also
includes the Comparable mixin and thus implements a <=> method.
I also have a Polygon class which is really just a container for an
array of the aforementioned Point class. I guess the name is a misnomer
but I’m working on adding functionality. Anyway, I want Polygon.sort to
return a new Polygon with the points sorted, and Polygon.sort! to modify
the points inside of the current polygon.
I’ve attempted it, and it seems to work, but I was wondering if anyone
could recommend a more canonical or idiomatic way to do it, or point out
any flaws with my approach.
class Point
include Comparable
attr_accessor :x, :y
def initialize(x, y)
@x = x
@y = y
end
def <=>(other)
x_cmp = @x <=> other.x
x_cmp != 0 ? x_cmp : @y <=> other.y
end
end
class Polygon
include Enumerable
attr_accessor :points
alias_method :_sort, :sort
def initialize(points)
@points = points
end
def each(&blk)
@points.each(&blk)
end
def sort
Polygon.new _sort
end
def sort!
@points = _sort
end
end
Example usage
poly = Polygon.new [Point.new(3,4), Point.new(1,2)]
poly.sort
poly.sort!