在另一種語言從一個長的限制編碼返回到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形式,檢測地圖滾動,縮放和等事件
找出方法是否返回值是不幸的,相當於解決停機問題。 –