Как Rubocop статически проверяет ошибки синтаксиса ruby - PullRequest
0 голосов
/ 12 мая 2019

Как Rubocop статически проверяет ошибки синтаксиса ruby? Поскольку Ruby является динамическим языком, если вы не используете Rubocop, вы будете получать уведомления только о синтаксических ошибках во время выполнения? То есть когда вы запускаете вашу программу, она падает из-за синтаксической ошибки?

Ответы [ 2 ]

3 голосов
/ 12 мая 2019

Вам даже не нужен такой инструмент, как Rubocop.Сам Ruby может проверять синтаксис без выполнения кода:

$ ruby --help
Usage: ruby [switches] [--] [programfile] [arguments]
[...]
-c              check syntax only
[...]

Давайте проверим, обнаружит ли синтаксическую ошибку:

$ ruby -c -e "def; end"
-e:1: syntax error, unexpected ';'

Ruby сначала читает и анализирует исходный код и выполняет его вболее поздний шаг.Если первый шаг синтаксического анализа уже завершился неудачей, потому что код не имеет никакого смысла, выполнение в любом случае будет невозможно.Это не выполнение, которое находит синтаксические ошибки, это синтаксический анализ кода.

Но, конечно, есть ошибки, которых Ruby не находит, но другие языки программирования могут обнаружить их при компиляции кода.Например, TypeError:

$ ruby -c -e "[1,2][:bar]"
Syntax OK

Синтаксис в порядке, но работает ли этот код на самом деле?

$ ruby -e "[1,2][:bar]"
Traceback (most recent call last):
-e:1:in `<main>': no implicit conversion of Symbol into Integer (TypeError)
0 голосов
/ 14 мая 2019

RuboCop использует парсер гем. Gem предоставляет некоторую диагностическую информацию, когда он встречает синтаксические ошибки во время синтаксического анализа. RuboCop просто перепаковывает ошибку разбора внутри Lint / Syntax полицейского и использует диагностическую информацию для создания нарушения RuboCop с хорошим сообщением об ошибке.

...