Что не так с этим рубиновым кодом?синтаксическая ошибка, неожиданный tIDENTIFIER, ожидаемый ключевое слово - PullRequest
2 голосов
/ 07 марта 2012

Этот код взят из книги под названием Ruby Best Practice:

def respond_to?(message)
  message = message.to_sym
  [:__result__, :inspect].include?(message) ||
    __result__.respond_to? message
end

Но я получаю ошибку: синтаксическая ошибка, неожиданный tIDENTIFIER, ожидаемый ключевое слово_end. В чем дело?

1 Ответ

3 голосов
/ 07 марта 2012

Вам нужно еще несколько скобок, например,

def respond_to?(message)
  message = message.to_sym
  [:__result__, :inspect].include?(message) ||
    __result__.respond_to?(message)
end

или (но выглядит уродливее)

def respond_to?(message)
  message = message.to_sym
  [:__result__, :inspect].include?(message) ||
    (__result__.respond_to? message)
end

В любом случае Рубин понимает:

def respond_to?(message)
  message = message.to_sym
  ([:__result__, :inspect].include?(message) ||
    __result__.respond_to?) message
end

из-за приоритета оператора.

Я люблю вызывать функции без круглых скобок, но это хорошо, только когда код не является неоднозначным, ruby ​​не назначает какой-либо приоритет новой строке, как это делает для || функция.

...