2014-01-13 2 views
1
내가 루비 자바 스크립트에서 다음 루프 "번역"할 필요가

:계수는 항상 반환 거짓

until i == b.length-1 do 
    unless i%2 == true 
    c += b[i] 
    i += 1 
    end 
end 

을 : 나는 루비에서 동일하게 작성하는 시도 방법

다음
for(i=0;i<=b.length-1;i++){ 
    if(!(i%2)){ 
    c+=b[i] 
    } 
} 

입니다 그러나 루비의 모듈러스 연산자는 항상 false를 반환하는 것처럼 보입니다. 전체 조건을 의미없는 것으로 만듭니다.

내가 뭘 잘못하고 있니? 동등하게,

unless i%2 == 1 

또는 :

답변

9

당신은해야

if i%2 == 0 

예기치 않은 동작의 이유는 루비가 false과의 "truthy"로 nil 제외 (0 포함) 모든 값을 처리하는 것입니다 조건문.

+0

예. 정확히 이유가 ... +1입니다. –

5
modulus operator이 정수가 아닌를 부울 반환 할 것으로 예상된다 둘 다 자바 스크립트와 루비에

:

unless i % 2 != 0 
    # ... 
: i도 있는지 확인하기 위해, 그래서

2 % 2 
# => 0 
3 % 2 
# => 1 

, 당신은 다음과 같이 당신의 상태를 구현해야

012 :

그러나 목적을 위해 나는 방법 Integer#even?Integer#odd?의 한을 사용하는 것이 더 좋다고 생각한다

2

자바 스크립트에서 0-0은 위선 값이므로 비교할 때 false으로 평가됩니다. 다른 모든 Numbertrue으로 평가됩니다.

루비에서는 객체를 비교할 때 암시 적 유형 변환이없고 0true으로 평가됩니다. Ruby에서 비교하고 싶다면 코드 대신

if i%2 == 0 

을 사용해야합니다.