Непонятная синтаксическая ошибка в Ruby: «синтаксическая ошибка, неожиданный конец» при использовании недопустимого оператора - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь понять, почему Ruby сообщил о синтаксической ошибке, которую он сделал, и почему она не может быть более ясной. Следующий фрагмент кода дает мне «синтаксическую ошибку, неожиданный конец»

# @param {NestedInteger[]} nested_list
# @return {Integer}
def depth_sum(nested_list)
  queue = Queue.new

  nested_list.each { |element| queue.enq element }

  result = 0
  level  = 1
  until queue.empty?
    size = queue.size
    size.times do
      element = queue.pop
      if element.is_integer
        result += level * element.get_Integer
      else
        element.each { |elem| queue.enq(elem) }
      end
    end
    level++
  end
end

Затем я понял, что Ruby не имеет оператора ++, поэтому я заменил уровень ++ на уровень + = 1 и код работал. Но почему сообщение о синтаксической ошибке Ruby было настолько криптичным c о неожиданном конце, когда на самом деле моя ошибка была не в "конце", а в том, что я использовал оператор ++, который не используется в Ruby ,

1 Ответ

1 голос
/ 19 марта 2020

В Ruby разрешено иметь пробел между оператором и его операндом (ами). Это включает в себя переводы строк и унарные префиксные операторы. Таким образом, следующее совершенно верно Ruby:

+
foo

Это то же самое, что

+ foo

, что совпадает с

+foo

, что то же самое, что и

foo.+@()

Следующее также совершенно верно Ruby:

foo++
bar

Это то же самое, что

foo ++ bar

, что совпадает с

foo + + bar

, что совпадает с

foo + +bar

, что совпадает с

foo.+(bar.+@())

Итак, как вы можете видеть, строка

level++

само по себе не синтаксически неверно. Это end в строке next делает это недействительным. Это именно то, что говорится в сообщении об ошибке: вы используете унарный префиксный оператор +, поэтому Ruby ожидает операнд, но вместо этого находит end, которого он не ожидал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...