Руби пока ошибки - PullRequest
       3

Руби пока ошибки

0 голосов
/ 10 января 2012

Ruby, который обычно очень простителен, выдает ошибку в цикле 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--
                                                       ^

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 10 января 2012

В 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
2 голосов
/ 10 января 2012

Рубин может иногда прощать , но не о несуществующих операторах: key-- -> key -= 1

Вы используете Ruby как язык низкого уровня (как C), более идиоматический (и функциональный) подход:

def foo(vals)
  (vals.size - 1).downto(1).detect { |idx| vals[idx] > vals[idx-1] } || 0
end
1 голос
/ 10 января 2012

В Ruby нет ни унарных операторов -- или ++, ни синтаксиса while, который вы пытаетесь использовать.Попробуйте вместо этого:

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

Как @IgorKapkov предлагает, вы также можете перевернуть его, что более рубиново:

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