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

Не было бы более удобно, если бы метод .between? возвратил true в третьей строке? Если нет, почему бы и нет?Незначительные неудобства .between? метод

EDIT для осветления

Вот исходный код (простите, но 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 в качестве диапазона - он запускает своего рода «случай ... когда» на двух разных операторах «<=>». Думаю, мой вопрос несколько философский. Учитывая весь удивительно сладкий синтаксический сахар на языке Ruby, было бы недостатком использования метода «между?» Автоматически сортировать два значения параметра? – pgblu

+0

Я подозреваю причину, по которой он не читает его, поскольку диапазон действительно для целей производительности, поскольку в некоторых случаях включение диапазона использует 'succ'. Сравните ''bbbbbb..between? (' A ',' zzzzzzzzzzzz ')' (мгновенный) с '(' a '..' zzzzzzzzzzzz '). Include? 'bbbbbb'' (занимает несколько секунд на моем рабочем столе). – Max

Смежные вопросы