2016-12-04 30 views
2

在另一种语言从一个长的限制编码返回到Ruby后,我经常认为foo.sortfoo.map {...}foo.sub /bar/, 'zip'变化 FOO。当然我的意思是foo.sort!等等。但是在我注意到之前,通常需要3或4次调试。同时,排序是计算出来的,但是没有分配任何东西。我可以让红宝石​​警告关于缺少左值,就像C编译器警告函数的忽略返回值?检测缺少子!那种!地图!等

+0

找出方法是否返回值是不幸的,相当于解决停机问题。 –

回答

1

这里有一个非常基本解析器:

@forgetful_methods = %w(sort map sub) 

Dir['*.rb'].each do |script| 
    File.readlines(script).each.with_index(1) do |line, i| 
    @forgetful_methods.each do |method| 
     if line =~ /\.#{method}(?!!)/ && $` !~ /(=|\b(puts|print|return)\b|^#)/ 
     puts format('%-25s (%3d) : %s', script, i, line.strip) 
     end 
    end 
    end 
end 

# => 
# brace_globbing.rb   (13) : subpatterns.map{|subpattern| explode_extglob(match.pre_match+subpattern+match.post_match)}.flatten 
# delegate.rb    (11) : @targets.map { |t| t.send(m, *args) } 

它检查sortmapsub在当前目录中每一个Ruby脚本,而不!不受=putsprintreturn之前。

这只是一个开始,但也许它可以帮助你找到一些低垂的水果。虽然有很多误报。

更复杂的版本可以使用抽象语法树,例如Ripper

+0

Mittag的“暂停问题”评论和tadman的具体例子的确表明,低悬的水果是最好的人可以期待的。这种测试的一些误报是可以接受的。 –

2

你的意思是像Perl的臭名昭着的“在无效上下文中使用map”?我不知道Ruby有这样的事情。听起来你需要更多的单元测试来捕捉这样的错误,然后才能够深入到你的代码中,以便被视为错误。

请记住,Ruby比Perl等语言更灵活。例如,下面的代码可能有用:

def rewrite(list) 
    list.map do |row| 
    row += '!' 
    end 
end 

现在从技术上来说这是一个无效的情况下一个map,而是因为它是作为一个返回值是可能在其他地方拍摄的。来电者有责任使用它。将方法本身标记为某种警告是从大多数分类工具可以执行的操作中删除的级别。