Which implementation of 'inject' are you using? The one in PragProg requires
an initial value to be passed as a parameter.
It's Andy's Windows installer version:
D:\Temp>ruby -v
ruby 1.8.0 (2003-05-26) [i386-mswin32]
And ri says about inject:
D:\Temp>ri inject
This is a test 'ri'. Please report errors and omissions
on
http://www.rubygarden.org/ruby?RIOnePointEight
------------------------------------------------------
Enumerable#inject
enumObj.inject(initial) {| memo, obj | block } -> anObject
enumObj.inject {| memo, obj | block } -> anObject
---------------------------------------------------------------------
Combines the elements of enumObj by applying the block to an
accumulator value (memo) and each element in turn. At each step,
memo is set to the value returned by the block. The first form lets
you supply an initial value for memo. The second form uses the
first element of the collection as a the initial value (and skips
that element while iterating).
With an array of N elements you either need to do N-1 comparisons,
This is what the second form does.
or you
need to start with a sentinel value which is guaranteed to be less than all
other elements (nil and 0 both aren't suitable).
This is what the first form would do.
BTW, if you wanted to add the compare method as a parameter as
someone else suggested, you could define
module Enumerable
def ordered?( compare_method = :< )
inject { | last, item |
return false unless last.send( compare_method, item )
item
}
true
end
end
and then call it like
p [ 1, 2, 2 ].ordered? # => false
p [ 1, 2, 2 ].ordered?( :<= ) # => true
Isn't it fun to code in Ruby :< )
Regards,
Pit