2012-01-09 254 views
0

紅寶石,通常是非常寬容的,給我一個while循環的錯誤;我看不出爲什麼。紅寶石雖然錯誤

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-- 
                ^

任何想法?

+0

哪裏使用了newkey? – tokland 2012-01-09 23:12:45

+0

可能重複[ruby遞增整數](http://stackoverflow.com/questions/7993915/ruby-incrementing-integer) – 2012-01-10 00:41:08

回答

3

Ruby沒有預/後遞增/遞減操作。我們使用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

呵呵,很高興知道。 我其實曾嘗試過,但仍然使用增量運算符。 – 2012-01-09 23:07:48

2

紅寶石有時可能寬容,但不是不存在的操作符:key-- - >key -= 1

您使用紅寶石,因爲它是一個低級語言(如C)中,更慣用的(和功能)做法:

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確實使「第二」結束「是相同的。 – 2012-01-09 22:59:22

+0

你是對的@IgorKapkov。我已經更新了我的答案。 – 2012-01-09 23:08:14