2012-04-03 5 views

Antwort

6

Sie benötigen max_by, nicht max. http://www.ruby-doc.org/core-1.9.3/Enumerable.html#method-i-max_by

max:

Gibt das Objekt zurück in Enum mit dem Maximalwert. Das erste Formular setzt voraus, dass alle Objekte Comparable implementieren; die zweite verwendet den Block zu geben Sie eine < => b.

a = %w(albatross dog horse) 
a.max         #=> "horse" 
a.max {|a,b| a.length <=> b.length } #=> "albatross" 

So hat max einen Block nehmen, aber es tut nicht das, was man erwartet, dass es zu.

max_by:

Gibt das Objekt zurück in Enum, die den Maximalwert aus dem gegebenen Block gibt.

Wenn kein Block angegeben wird, wird stattdessen ein Enumerator zurückgegeben.

a = %w(albatross dog horse) 
a.max_by {|x| x.length } #=> "albatross" 
+0

'a.max_by {| x | foo (x)} 'hat funktioniert. Vielen Dank. –

+0

@BSeven Akzeptieren Sie diese Antwort, wenn Sie Zeit haben :) –

+1

Oder, im point-freien Stil: 'a.max_by (& method (: foo))'. –

1

Verwendung Array Karte: a.map{|v|foo(v)}.max

+0

Dies gibt die max von foo (v), die 18 ist. –

+0

richtig, habe die Frage nicht richtig bekommen, wenn Sie genaue Element nicht Ergebnis finden müssen, ist die obige Antwort gut: a.max_by {| v | foo (v)} – somyqk