2012-01-09 9 views
0

Ruby는 일반적으로 매우 관대하기 때문에 while 루프에서 오류가 발생합니다. 나는 이유를 알 수 없다.오류가있는 Ruby

def foo(vals) 
    n = vals.length 
    key = n-1 
    newkey = n-1 

    while ((key > 0) && (vals[key] <= vals[key-1])) key-- 

    key 
end 

오류 :

prog.rb:37: syntax error, unexpected tIDENTIFIER, expecting keyword_do_cond or ';' or '\n' 
    while ((key > 0) && (vals[key] <= vals[key-1])) key-- 
                ^

어떤 아이디어? >key -= 1

는 (C와 같은) 낮은 수준의 언어이었다로 당신은 루비를 사용하고, 더 관용적 (및 기능 - key-- :

+0

newkey는 어디에 사용됩니까? – tokland

+0

[ruby incrementing integer]의 가능한 복제본 (http://stackoverflow.com/questions/7993915/ruby-incrementing-integer) –

답변

3

루비에는 사전/사후 증가/감소 연산자가 없습니다. 우리는 x -= 1 을 사용하여 하나의 라이너가 필요할 때까지 붙여 넣습니다.

def foo(vals) 
    n = vals.length 
    key = n-1 
    newkey = n-1 

    key -= 1 while ((key > 0) && (vals[key] <= vals[key-1])) 
    key 
end 
+0

알았습니다. 실제로 퍼팅을 시도했지만 증가 연산자를 사용하고있었습니다. –

2

루비는 존재하지 않는 연산자에 대한 때때로을 용서 ,하지만 될 수있다) 접근 방법 :

def foo(vals) 
    (vals.size - 1).downto(1).detect { |idx| vals[idx] > vals[idx-1] } || 0 
end 
1

루비는 -- 또는 ++ 단항 연산자가없는 않으며, while 구문은 당신이 사용하려는. 대신이 시도 :

while key > 0 && vals[key] <= vals[key - 1] do key -= 1 end 

을 @IgorKapkov 더 Rubyish이다, 당신은 또한 주위를 돌 수 있듯이 :

key -= 1 while key > 0 vals[key] <= vals[key - 1] 
+0

"하지만 첫 번째 테스트 전에 실행되는 동안 이전의 파트와는 다른 의미가 있습니다. 뒤에 오는 조건의. "그것은 사실이 아니다. 예 :'x = 1; "첫 번째"동안 x <1; x <1은 "두 번째"를 끝내지 만 같은 결과입니다. –

+0

맞습니다. @IgorKapkov. 내 대답을 업데이트했습니다. –