簡體   English   中英

將方法的proc作為塊提供

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM