2016-12-04 69 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,而是因爲它是作爲一個返回值是可能在其他地方拍攝的。來電者有責任使用它。將方法本身標記爲某種警告是從大多數分類工具可以執行的操作中刪除的級別。