1
a = [4, 3, 2, nil]
a.max_by { |v| v * 2 } => NoMethodError: undefined method `*' for nil:NilClass

max_by をオーバーロードして nil 値を無視する方法は?

4

3 に答える 3

10

Array.compactを呼び出す前に nil を削除するために使用できますmax_by

a.compact.max_by { |v| v * 2 }
于 2012-06-25T04:54:31.700 に答える
4

Ruby へようこそ: 問題を解決する方法はたくさんあります!

非常に簡単な解決策は次のとおりです。

a.max_by { |v| v.to_f * 2 }

nil は強制的に 0 として浮動するため、これは負の値を処理しませんが、nil は NilClass と呼ばれるクラスの単一のインスタンスにすぎないため、Ruby のすべてのクラスと同様に、それを開いて数学を少し学習させることができます。

class NilClass
  # overloading * operator
  def *(y)
    # returning negative infinity: Ruby 1.8.7
    -1.0/0.0
    # returning negative infinity: Ruby 1.9.2
    # -Float::INFINITY
  end
end

今、私たちは持っています

a.max_by { |v| v * 2 }

4を返します。

于 2012-06-25T07:54:34.847 に答える
2

ここに別のものがあります:

a.max_by { |v| v.nil? ? -Float::INFINITY : v }
#=> 4

あなたの例では、これは明らかにより複雑ですcompactが、配列をソートして値を保持したい場合nilは便利なトリックです。または、最後までゼロにするなど、奇妙な方法で並べ替えたい場合は、次のようにします。

[0,4,5,6,1,9].sort_by { |v| v.zero? ? Float::INFINITY : v }
#=> [1, 4, 5, 6, 9, 0]
于 2012-06-25T07:21:21.573 に答える