【问题标题】:How does Rubocop statically check for ruby syntax errorsRubocop 如何静态检查 ruby​​ 语法错误
【发布时间】:2019-05-12 04:52:51
【问题描述】:

Rubocop 如何静态检查 ruby​​ 语法错误?由于 Ruby 是一种动态语言,如果您不使用 Rubocop,那么您是否只会在运行时收到语法错误通知? IE。当你运行你的程序时,它会因为语法错误而崩溃吗?

【问题讨论】:

  • 你能详细说明问题是什么吗?您想知道 Rubocop 如何在不实际运行代码的情况下解析 Ruby 代码(并且可以检测语法错误),还是想在没有 Rubocop 的情况下查找语法错误,还是您想知道的其他内容?
  • 我很好奇 Rubocop 如何在不实际运行代码的情况下解析 Ruby 代码(并且可以检测语法错误)。
  • 解析和运行代码是两件不同的事情,尽管它们通常在解释代码之后发生。虽然这不是它的主要主题,但我前几天读到的this article 很好地解释了 Ruby 是如何解析的。也可以浏览 GitHub 上的RuboCop source 尝试查找解析器代码。

标签: ruby rubocop


【解决方案1】:

您甚至不需要像 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)

【讨论】:

  • "恕我直言,这样的检查显然是可能的。" – 这一点都不明显。例如。 Perl5 不能静态解析,必须执行才能解析。 Perl6 具有动态语法,可以在运行时修改语言的语法。许多 Lisps 都有阅读器宏,至少这些阅读器宏需要在解析时执行。
  • @JörgWMittag 这很有趣。我从来没有详细研究过这一点,但如果没有想太多,我会认为所有的编程语言都会一个接一个地工作。我在回答中指控了措辞......
  • 感谢@spickermann!作为一个小的更正,我认为您的意思是“无论如何都不可能执行”而不是“无论如何也不不可能执行”?
【解决方案2】:

RuboCop 使用 parser gem。 gem 在解析时遇到语法错误时会提供一些诊断信息。 RuboCop 只是将解析错误重新打包到 Lint/Syntax cop 中,并使用诊断信息创建带有漂亮错误消息的 RuboCop 攻击。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2021-09-29
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多