は<=>
あなた自身を定義し、比較可能な含まれています。
class SizeMatters
include Comparable
attr :str
def <=>(anOther)
str.size <=> anOther.str.size
end
def initialize(str)
@str = str
end
def inspect
@str
end
end
s1 = SizeMatters.new("Z")
s2 = SizeMatters.new("YY")
s3 = SizeMatters.new("XXX")
s4 = SizeMatters.new("WWWW")
s5 = SizeMatters.new("VVVVV")
s1 < s2 #=> true
s4.between?(s1, s3) #=> false
s4.between?(s3, s5) #=> true
[ s3, s2, s5, s4, s1 ].sort #=> [Z, YY, XXX, WWWW, VVVVV]
あなたが実際に匹敵含める必要はありませんが、あなたは<=>
を定義した後にそれを行う場合、あなたは自由のための追加機能を得る:これはComparable docからです。
オブジェクトが<=>
をすでに実装している場合は、Enumerable's sort
をブロックに使用できます。
編集:いくつかの異なる比較を使用する別の方法は、lambdasを使用することです。これは、新しい1.9.2宣言の構文を使用します。
ascending_sort = ->(a,b) { a <=> b }
descending_sort = ->(a,b) { b <=> a }
[1, 3, 2, 4].sort(& ascending_sort) # => [1, 2, 3, 4]
[1, 3, 2, 4].sort(& descending_sort) # => [4, 3, 2, 1]
foo = ascending_sort
[1, 3, 2, 4].sort(& foo) # => [1, 2, 3, 4]
文字通り、あなたは 'items.sortを使用することができます! {| x、y | x.my_comparator y} 'ですが、これがクラスのデフォルトのソート動作であれば、Tin Manが以下のように考えるべきです。 – coreyward