[英]Provide a proc to a method as a block
假設我有以下數組:
arr = [[5, 1], [2, 7]]
我想找到最小元素,比較元素的第二個元素。 最小元素將是[5, 1]
因為1
小於7
。 我可以使用以下代碼:
arr.min {|a,b| a[1] <=> b[1]}
為了計算最大值,我也可以這樣做:
arr.max {|a,b| a[1] <=> b[1]}
這給出了[2, 7]
。
我一直使用相同的塊。 我想在某處擁有該塊並將其提供給min / max函數。 我希望這樣的事情:
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]]
對這類問題的更通用的解決方案是完全避免嵌套數組並改為使用類。 然后,您可以為該類定義<=>運算符,使您可以訪問Comparable 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和sort函數,而無需定義比較運算符。 所以...
@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是一種非常面向對象的編程語言,為您提供了非常強大的工具。 我完全建議您閱讀“Ruby編程語言”或“The Ruby Way”這樣的書,以便對該語言的強大功能進行適當的概述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.