39

我编写的大部分代码都是用 Ruby 编写的,而且每隔一段时间,我就会犯一些错字,但过一会儿就会被抓住。当我的脚本运行长任务时,这很烦人,然后返回发现我有错字。

是否有积极开发的 Ruby lint 工具可以帮助我克服这个问题?是否可以在处理大量源文件的系统中使用它,其中一些是动态加载的?

以这个片段为例:

a = 20
b = 30
puts c

要赢得赏金,请向我展示一个工具,该工具将检测c变量为未创建/未定义。

4

9 回答 9

24
  • ruby -c myfile.rb将检查正确的 Ruby 语法。
  • Reek检查 Ruby 代码中常见的代码异味。
  • Roodi检查 Ruby 代码中常见的面向对象设计问题。
  • Flog可以警告您异常复杂的代码。

[Plug] 如果您的项目位于公共 Github 存储库中,Caliper可以在您每次提交时在您的代码上运行后三个工具和其他工具。(免责声明:我在 Caliper 上工作)

于 2009-11-27T04:42:48.447 回答
13

你可以试试响尾蛇红宝石。它对 Ruby 代码进行静态类型检查,因此会责怪您使用未定义的变量。

虽然 DRuby 是一个正在进行的研究项目,但它已经非常适合小型、自包含的 Ruby 脚本。目前,它无法分析“开箱即用”的大部分 Ruby 标准库。目前他们正致力于在 Rails 上键入 Ruby(请参阅他们最近的论文)。

于 2009-12-07T16:53:25.890 回答
11

RubyMine ( http://www.jetbrains.com/ruby ) 可以解决问题:

替代文字 http://img707.imageshack.us/img707/5688/31911448.png

以下都不会完成 RubyMine 所做的所有分析。

  • NetBeans Ruby 包
  • Aptana RadRails
  • gVIM(带有 scrooloose 的合成插件)

每一个都能够识别语法错误,例如错误的括号数量、过多的 def、结束、大括号等。但是没有一个能够像 RubyMine 那样识别无效的方法调用。

原因如下:这很困难。

由于 Ruby 非常动态(并且可以很容易地动态生成像“c”这样的方法),任何试图识别不存在的变量/方法的编辑器都需要加载整个环境的很大一部分和多个程序流路径不断测试以获得准确的“有效性”结果。这比在几乎所有编程都是静态的 Java 中要困难得多(至少在我丢掉那顶帽子的时候)。

这种轻松地动态生成方法的能力是社区对测试如此推崇的原因之一。我真的建议您也尝试测试。

于 2009-12-05T17:10:03.430 回答
7

看看RuboCop。它是一个基于Ruby 样式指南的 Ruby 代码样式检查器。它维护得非常积极,并支持所有主要的 Ruby 实现。它适用于 Ruby 1.9 和 2.0,并具有出色的 Emacs 集成。

于 2013-04-17T15:00:58.400 回答
5

是的。Test::Unit

好的,我知道您已经知道这一点,并且在某种意义上这是一个无用的答案,但是您确实提出了鸭子打字的负面后果,即(此时)没有办法只编写更多测试比 Java 可能需要的东西。

因此,作为记录,请参阅Test::UnitRuby 标准库或其他测试框架之一。

拥有可以运行和重新运行的单元测试是捕获错误的最佳方法,并且您确实需要在 Ruby 等动态语言中使用更多的单元测试(测试,而不是错误 :-)...

于 2009-11-26T18:49:22.680 回答
2

nitpick可能是您正在寻找的东西。

使用此代码:

class MyString < String
  def awesome
    self.gsub("e", "3").gsub("l", "1").uppercase
  end
end

puts MyString.new("leet").awesome

...它输出:

$ nitpick misspelling.rb 
*** Nitpick had trouble loading "misspelling.rb":
    NoMethodError undefined method `uppercase' for "133t":MyString
Nothing to report boss! He's clean!
于 2010-10-27T20:38:27.253 回答
0

还没有使用它,但听起来很有希望(当我测试这个时会更新)。

https://github.com/michaeledgar/laser

Ruby 代码的静态分析和样式 linter。

于 2011-12-24T17:55:37.873 回答
0

Pelusa很好,但只在 rubinius 中工作。不过,对于熟悉 RVM 的人来说,这不应该是一个问题。

于 2012-08-29T17:24:10.793 回答
-1
avdi@lazarus:~$ irb
>> a = 20
=> 20
>> b = 30
=> 30
>> puts c
NameError: undefined local variable or method `c' for main:Object
        from (irb):3
>>

好了,该工具称为“ IRB”。我得到赏金了吗?

我只是半开玩笑。我写了第二个答案,希望能在 Ruby 中明白这一点,如果你想知道是否定义了某些东西,你必须运行代码

于 2009-12-02T20:32:00.787 回答