2014-11-01 30 views
0
n = 4 
n.between?(3,5) # => true 
n.between?(5,3) # => false 

如果.between?方法在第三行返回true會不會更方便?如果不是,爲什麼不呢?。間的不便之處?方法

編輯澄清

這裏是源代碼(原諒我,但C是不是我的母語)

   static VALUE 
cmp_between(VALUE x, VALUE min, VALUE max) 
{ 
    if (RTEST(cmp_lt(x, min))) return Qfalse; 
    if (RTEST(cmp_gt(x, max))) return Qfalse; 
    return Qtrue; 
} 

會是什麼負面影響(除了它可能打破很多現存的遺留代碼)如果這被改爲

   static VALUE 
cmp_between(VALUE x, VALUE y, VALUE z) 
{  
    if (RTEST(cmp_lt(y, z))) { 
     y = min; 
     z = max; } 
    else { 
     z = min; 
     y = max; } 
    if (RTEST(cmp_lt(x, min))) return Qfalse; 
    if (RTEST(cmp_gt(x, max))) return Qfalse; 
    return Qtrue; 
} 

回答

4

這背後的推理是數學的。假設你想檢查某個區域是否在區間[0,Y]。在數學上,這纔有意義,如果Y大於或等於0的方式between?的作品,你可以檢查很容易與

n.between?(0, y) 

如果它的工作你描述的方式,那麼區間[0,Y ]和[Y,0]將被視爲相同(這將真正混淆數學家)。而你也需要兩次檢查:

y >= 0 and n.between?(0, y) 

但是,如果你不在乎在所有關於數學家的感覺,你可以很容易地使順序無關:

n.between?(*[x,y].sort) 
+0

但紅寶石甚至不讀0和y作爲範圍 - 它在兩個不同的'<=>'運營商上運行一種'case ... when'。我想我的問題是一個有點哲學的問題。考慮到Ruby語言中所有令人驚訝的甜語法糖,使用'between?'方法自動排序兩個參數值的缺點是什麼? – pgblu 2014-11-01 22:15:45

+0

我懷疑它不讀它的原因,因爲範圍實際上是爲了性能目的,因爲在某些情況下,範圍包含使用'succ'。比較''bbbbbb'。between?('a','zzzzzzzzzzz')(瞬時)到'('a'..'zzzzzzzzzzzz')。 'bbbbbb''(我的桌面需要幾秒鐘)。 – Max 2014-11-01 22:21:24