2015-11-15 28 views
-1

你好,我是在ruby編程的新手。 冉橡膠檢查我的項目,它說:Rubocop:方法有太多的線

方法有太多的線。 [13/10]高清refresh_status

這裏是我的方法:

def refresh_status 
    lost = false 
    in_progress = false 
    won = false 
    @bets.each do |bet| 
     lost = true if bet.result == :lost 
     if bet.result == :canceled 
     @to_return /= bet.odd 
     won = true 
     end 
     in_progress = true if bet.result == :in_progress 
     won = true if bet.result == :won 
    end 
    def_result_after_refresh(lost, in_progress, won) 
    end 

    def def_result_after_refresh(lost, in_progress, won) 
    if lost 
     @result = :lost 
    elsif in_progress 
     @result = :in_progress 
    elsif won 
     @result = :won 
    end 
    end 

無法找到一種方法,使該方法更短,也許你能幫忙嗎?

+0

比較'bet.result'的所有條件。你可以使用'case'語句來使你的代碼更具表現力,但可能不會更短。因此,您可以在一行中進行初始化,例如'lost,in_progress,won = false,false,false'。 – sschmeck

+0

rubocop不允許使用平行(一行)assingments @sschmeck – user3662708

回答

1

您可以使用一些Enumerable方法。

def refresh_status 
    @to_return /= @bets.select { |bet| bet.result == :canceled }.map(&:odd).reduce(1, :*) 

    results = @bets.map { |bet| bet.result == :cancelled ? :won : bet.result }.uniq 
    @result = case 
      when results.include?(:lost) then :lost 
      when results.include?(:in_progress) then :in_progress 
      when results.include?(:won) then :won 
      end 
end 
+0

所以我說我是一個新手,所以你可以告訴什麼地圖(&:奇怪)呢?我知道它把選定的元素列出來,但是'&:odd'是什麼? @sschmeck – user3662708

+0

好問題。 'bets.map(&:odd)'從投注數組中建立一個新的數組,其中所有投注都會被bet.odd的值替換(或映射)。這是'bets.map {| bet |的一個快捷方式bet.odd}'。它有幫助嗎? 「減少」非常相似。 – sschmeck

+0

是的。對於完整的rubocop接受,我需要縮短和'當results.include?(:won)時:'lost'不是很正確,它應該是'當results.include?(:won)then:won' by way I會接受你的答案 – user3662708