“Simon Strandgaard” 0bz63fz3m1qt3001@sneakemail.com schrieb im
Newsbeitrag news:pan.2003.07.21.12.42.13.887241@sneakemail.com…
OK… this is the nicest solution so far
I’ve found an even nicer solution that allows user defined comparisons
nicely:
def less(*args); check_chain(*args){|a,b|a<b}; end
def greater(*args); check_chain(*args){|a,b|a>b}; end
def check_chain(*args, &comp)
raise “Block needed” unless comp
last = nil
args.each do |i|
return false if last and not comp.call(last,i)
last = i
end
true
end
less 1,10,22
less 2,1,14
less -2,1,14
greater 10,3,-100
greater 2,1,14
check_chain( 2, 4, 16 ){|a,b| aa==b}
check_chain( 2, 4, 17 ){|a,b| aa==b}
The thing that bugged my about the last one was the first parameter to
compare_chain() which prevented nice user defined checks.
I didn’t thought of using proc’s for binary compares.
The proposed implementation of ordering? inspired my. Though while
writing this I see a more general pattern here that reminds a bit of
Enumerable#inject (Ruby 1.8):
module Enumerable
def connect(coll)
last = nil
first = true
each do |i|
if first
first = false
else
coll = yield(coll,last,i)
end
last = i
end
coll
end
end
def less(*args); args.connect( true ){|c,a,b|c && a<b}; end
def greater(*args); args.connect( true ){|c,a,b|c && a>b}; end
[1, 2, 3].connect( true ){|coll,a,b|coll && a<b}
[2, 4, 16].connect( true ){|coll,a,b|coll && a*a==b}
These versions are less efficient for sequences that fail the test but one
might consider to change the implementation to stop if coll is false or
nil.
Method Enumerable#connect might even be considert a library addenum, IMHO.
Maybe inject might be changed to yield one more parameter the way it is
shown here. What does Matz think? What do others think?
Regards
robert