2016-09-17 4 views
2

警官があります:RuboCop::Cop::Lint::NextWithoutAccumulatorです。`reduce`にaccumulator引数を指定して` next`を使います

この警官が何であるか説明できる人はいますか、どのようにコードを改善するのでしょうか?

読みやすく、効率が向上しますか?

github code

# bad 
result = (1..4).reduce(0) do |acc, i| 
    next if i.odd? 
    acc + i 
end 

コンソールでこれをしようとした場合、あなたはnilオブジェクトのNoMethodError例外が発生します:

+0

あなたがリンクしている警官の文書から2つの例を実行しようとしましたか? –

+0

@muistooshort私には恥ずかしがり屋 - 私は夜遅くまでこの急な質問を少なくとも少しは受け入れることを願っています。 –

答えて

6

は、ドキュメントからのサンプルコードを考えてみましょう。これは、オブジェクトが指定されていない場合、nextnilを返します。イテレータの場合はreturnとして扱うことができます。

reduce methodの場合、ブロックによって返される値が必要なため予期しない動作が発生することがあります。 iが奇数の場合、nextが評価され、結果としてnilがブロックされます。次のイテレータではaccnilと等しく、整数を追加することはできません。この例では、最初の反復はi = 1nextはブロックの結果としてaccnilに設定されています。

いくつかのケースでは、列挙可能な値を正しく得ることができますが、一般的にnextの値を指定する方が安全です。

+0

詳細な回答をありがとう! –

+0

これは質問には答えませんが、 (トピックから外れて、意見を必要とするような) - バウンド。 –

関連する問題