ブロックとしてメソッドにPROCを提供します
-
09-10-2019 - |
質問
次の配列があるとしましょう。
arr = [[5, 1], [2, 7]]
そして、要素の2番目の要素を比較して、最小要素を見つけたいと思います。最小要素は次のとおりです [5, 1]
以来 1
よりも少ない 7
. 。次のコードを使用できます。
arr.min {|a,b| a[1] <=> b[1]}
最大値を計算するために、同じことができます。
arr.max {|a,b| a[1] <=> b[1]}
それは与えます [2, 7]
.
私は常に同じブロックを使用しています。そのブロックをどこかに持っていて、それを最小/最大関数に提供したいと思います。私は次のようなものを望んでいました:
blo = lambda {|a,b| a[1] <=> b[1]}
arr.min blo
動作しますが、そうではありませんでした。これがどのようにできるかについての考えはありますか?
解決
使用 &
回転する演算子 Proc
ブロックにオブジェクト。
arr.min &blo
他のヒント
@sepp2kの答えはより一般的なものですが、あなたの特定の場合、私はただ使用します
arr.min_by(&:last)
arr.max_by(&:last)
それはそうだからです 多くの これらのすべての巻き毛のブレース、四角い括弧、アレイインデックスが浮かんでいるよりも明白です。
必要なものがすべて最小で最大である場合、使用する場合があります Enumerable#minmax
方法と両方を一度に計算します。
min, max = arr.minmax {|a,b| a[1] <=> b[1]}
#=> [[5, 1], [2, 7]]
min
#=> [5, 1]
max
#=> [2, 7]
編集:地獄、私もあることに気づきました minmax_by
, 、したがって、それを組み合わせることができます last
方法、そして持っています:
min, max = arr.minmax_by &:last
これはどう?
=> [[5, 4], [9, 5], [2, 7]]
>> arr.sort!{|x,y| x[1]<=>y[1] }
=> [[5, 4], [9, 5], [2, 7]]
>> min,max=arr[0],arr[-1]
=> [[5, 4], [2, 7]]
このような問題のより一般的な解決策は、ネストされたアレイを完全に避け、代わりにクラスを使用することです。その後、そのクラスの<=>オペレーターを定義して、比較可能なMixin(http://ruby-doc.org/core/classes/comparable.html)のすべての機能にアクセスできるようになります。 、==、> =、および>演算子とメソッド「間」?」
これは単なる例です。実際の生活では、それらが保存するものを説明するクラスを使用します。
class Duo
include Comparable
def initialize( a, b )
@a = a
@b = b
end
def <=>(rhs)
@b <=> rhs.b
end
end
DUOオブジェクトの配列がある場合は、比較演算子を定義することなく、MIN、MAX、およびソート機能を使用できます。それで...
@a = Duo.new( 1, 10 )
@b = Duo.new( 2, 5 )
@c = Duo.new( 3, 1 )
[ @a, @b, @c ].sort
配列[@c、@b、@a]を返します
と
[@a, @b, @c].max
戻ってきます @a
これは、アレイの位置に依存するロジックを備えたネストされたデータ構造よりもはるかに「Ruby Way」です。最初は少し多くの作業が必要ですが、あなたはそれを見つけるでしょう 多くの 長期的にはより良い。
Rubyは非常にオブジェクト指向のプログラミング言語であり、使用するための非常に強力なツールを提供します。 「The Rubyプログラミング言語」や「The Ruby Way」などの本を読んで、言語の力の適切な概要を取得することを徹底的にお勧めします。