Monday, October 20, 2008

(23)对象的“顺序”

==用于判断对象是否相同,一些类还定义了“顺序”。比如两个对象可能相等,也可能一个对象“小于”另一个对象。数字对象就是一个最好的例子,比如5大于4说明5在4的后面,字符串也存在顺序,字符串的比较通过比较字符串的ASCII码来实现。在Ruby中类的顺序可以通过实现<=>操作符,如果说明操作符左边的值小于右边的,如果返回0说明两边的值是相等的,如果返回1说明,左边的值大于右边的。如果<=>两边的对象是不同的则返回nil。
1 <=> 5     # -1
5 <=> 5 # 0
9 <=> 5 # 1
"1" <=> 5 # nil: 字符串和数字无法比较。

<=> 用于比较已经足够了,但是这个符号看起来不够“直白”。在Ruby的minxin模块中基于<=> 定义了一系列其他的操作符,这样操作符意思更加明确:
  • < 小于
  • > 大于
  • <= 小于等于
  • >= 大于等于
  • > 大于
  • == 等于
如果你所见,这里没有定义!=符号。此外我们还将看到一个方法between?,它用于判断一个对象是否位于两个对象之间:
1.between?(0,10)  # true: 0 <= 1 <= 10
注意如果你个<=>的比较结果是nil,那么所有基于他的比较都返回false,对象Float他的返回结果是NaN.

No comments: