当在bsearch()中使用<=>
符号时,必须将待比较值放在左边,因为<=>
的操作符两边元素的顺序很重要。
a = [-1, 1, 2, 4, 5]
# 待比较值放左边,参数放右边
a.bsearch {|x| -1 <=> x} # -1
a.bsearch {|x| 1 <=> x} # 1
a.bsearch {|x| 2 <=> x} # 2
a.bsearch {|x| 4 <=> x} # 4
a.bsearch {|x| 5 <=> x} # 5
a.bsearch {|x| 3 <=> x} # nil
# 待比较值放右边,参数放左边
a.bsearch {|x| x <=> -1} # nil
a.bsearch {|x| x <=> 1} # nil
a.bsearch {|x| x <=> 2} # 2
a.bsearch {|x| x <=> 4} # nil
a.bsearch {|x| x <=> 5} # nil
首先分析待比较值放左边,参数放右边的情况。
对于-1 <=> x
和1 <=> x
,首先取中间元素2,比较的返回结果为-1,于是向左继续取得子数组[-1, 1]
,继续取中间元素1,对于1 <=> x
所比较的返回结果0,于是立即停止并返回元素1。对于-1 <=> x
比较的返回结果-1,于是向左继续取自数组[-1]
,最终比较的返回结果为0,返回-1元素。
对于2 <=> x
,第一次取中间元素2就得到0,立即停止并返回。
对于4 <=> x
和5 <=> x
,首先取中间元素2,比较的返回结果为1,于是向右继续取得子数组[4, 5]
,继续取中间元素5,对于5 <=> x
所比较的返回结果0,于是立即停止并返回元素51。对于4 <=> x
比较的返回结果-1,于是向左继续取自数组[4]
,最终比较的返回结果为0,返回4元素。
对于3 <=> x
,自行分析。
再分析待比较值放右边,参数放右边的情况。
对于x <=> -1
和x <=> 1
,首先取中间元素2,比较的返回结果为1,于是向右继续取得子数组[4, 5]
,到这已经不用再向后分析了,因为它们都大于待比价的值,使得一直向右取子数组,最终导致返回nil。
对于x <=> 2
,第一次取中间元素2就得到0,立即停止并返回。
对于x <=> 4
和x <=> 5
,首先取中间元素2,比较的返回结果为-1,于是向右继续取得子数组[-1, 1]
,到这已经不用再向后分析了,因为它们都小于于待比价的值,使得一直向左取子数组,最终导致返回nil。