在另一种语言从一个长的限制编码返回到Ruby后,我经常认为foo.sort
,foo.map {...}
,foo.sub /bar/, 'zip'
将变化 FOO。当然我的意思是foo.sort!
等等。但是在我注意到之前,通常需要3或4次调试。同时,排序是计算出来的,但是没有分配任何东西。我可以让红宝石警告关于缺少左值,就像C编译器警告函数的忽略返回值?检测缺少子!那种!地图!等
2
A
回答
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) }
它检查sort
,map
或sub
在当前目录中每一个Ruby脚本,而不!
不受=
,puts
,print
或return
之前。
这只是一个开始,但也许它可以帮助你找到一些低垂的水果。虽然有很多误报。
更复杂的版本可以使用抽象语法树,例如Ripper。
+0
Mittag的“暂停问题”评论和tadman的具体例子的确表明,低悬的水果是最好的人可以期待的。这种测试的一些误报是可以接受的。 –
2
你的意思是像Perl的臭名昭着的“在无效上下文中使用map
”?我不知道Ruby有这样的事情。听起来你需要更多的单元测试来捕捉这样的错误,然后才能够深入到你的代码中,以便被视为错误。
请记住,Ruby比Perl等语言更灵活。例如,下面的代码可能有用:
def rewrite(list)
list.map do |row|
row += '!'
end
end
现在从技术上来说这是一个无效的情况下一个map
,而是因为它是作为一个返回值是可能在其他地方拍摄的。来电者有责任使用它。将方法本身标记为某种警告是从大多数分类工具可以执行的操作中删除的级别。
相关问题
- 1. 检测缺少方法
- 2. 缺少dll函数检测
- 3. GWT地图v3缺少drawinglib?
- 4. 检测缺少的数学表达式
- 5. MSIE浏览器检测:缺少基数?
- 6. PHPUnit的未检测缺少参数
- 7. 的Xcode 8检测到缺少约束
- 8. 基地SDK缺少
- 9. 缺少应该在那里的符号
- 10. Facebook - 缺少帖子
- 11. 禁止警告CS1998:这种异步方法缺少'等待'
- 12. 图片缺少
- 13. 谷歌地图:属性缺少
- 14. Bing地图API - 缺少瓷砖
- 15. 谷歌地图上缺少标记
- 16. 谷歌地图API缺少alt_id
- 17. mPDF缺少非本地图像
- 18. 网络测试 - 缺少DLL
- 19. 手动图例(scale_colour_manual)缺少绘图与几种美学效果
- 20. 缺少的图标
- 21. MSDTC中缺少本地DTC
- 22. Ruby测试:缺少方法的测试
- 23. 缺少FROM子句错误
- 24. 缺少耙子任务?
- 25. 缺少离子bash命令
- 26. 缺少FROM子句中posgresql
- 27. 缺少PHP数组孙子
- 28. 缺少罐子从repo1.maven.org
- 29. 学说缺少“WHERE”子句
- 30. Xamarin形式,检测地图滚动,缩放和等事件
找出方法是否返回值是不幸的,相当于解决停机问题。 –