2014-11-01 4 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? 작품보다 크거나 같은 경우 수학적으로는 의미가 당신이 설명하는 방식 일 경우는 간격 [0, Y,

n.between?(0, y) 

매우 쉽게 것을 확인할 수 있습니다 ]와 [Y, 0]은 똑같이 취급 될 것입니다. (이것은 정말로 수학자들에게 혼란 스러울 것입니다). 그리고 당신은 두 가지를 확인해야합니다 :

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

하지만 모든 수학자가 어떻게 생각하는지에 대해 상관하지 않는 경우, 당신은 쉽게 할 수 그것을 독립적 - 주문 :

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

를하지만 루비도 읽기되지 않는다 0과 y를 범위로 - 서로 다른 두 개의 '<=>'연산자에서 일종의 'case ... when'을 실행합니다. 나는 나의 질문이 다소 철학적 인 질문이라고 생각한다. Ruby 언어의 놀랄만큼 달콤한 구문 설탕을 고려할 때'between? '메서드를 사용하면 두 매개 변수 값을 자동으로 정렬하는 불이익은 무엇입니까? – pgblu

+0

범위를 포함하는 것은'succ'를 사용하기 때문에 어떤 경우에는 성능상의 이유로 실제로 범위를 읽지 못하는 것으로 의심됩니다. ? (​​'a', 'zzzzzzzzzzzz')'(순간적)에서'('a'.. 'zzzzzzzzzzzz') 사이의''bbbbbb ' 'bbbbbb'' (내 바탕 화면에서 몇 초 걸립니다). – Max

관련 문제