这么一段代码涉及了很多 ruby 的知识点。
尤其是在 initialize 中直接接受 block 参数太漂亮了,想想如果要实现不同的排序方法,只需要将这个方法生成一个 Proc,传递给数组就可以了。
class SortedArray < Array
def initialize(*args,&sort_by)
@sort_by = sort_by || Proc.new { |x,y| x <=> y }
super(*args)
sort! &@sort_by
end
def insert(i,v)
insert_before = index(find {|x| @sort_by.call(x,v) == 1})
super(insert_before ? insert_before : -1, v)
end
def <<(v)
insert(0,v)
end
alias push <<
alias unshift <<
["collect!","flatten!","[]="].each do |method|
self.class_eval %{
def #{method}(*args)
super
sort! &@sort_by
end
}
end
end