In message "[ruby-talk:03113] Min and max?"
on 00/06/06, Aleksi Niemel<aleksi.niemela / cinnober.com> writes:
>First I consider to add it to Numeric, but then I wrote something like
>
>module Kernel
> def min(a, b)
> if a < b
> a
> else
> b
> end
> end
>end
>
>Actually I can't say min(a,b) is much more beautiful compared to [a,b].min()
>but at least you don't have to know anything about arrays when using it and
>I expect it to be faster.
>
>Maybe the implementation should include the block version allowing c =
>min(a,b){|a,b| a.foo() < b.bar()}.
What do you think about putting mathfunc.rb including function
representation like those to RAA?
BTW, Maybe I will define min as follows,
module Math
def pickup0(symbol, *arg, &blk)
enum = arg.find_all{|a| a.is_a? Enumerable}
sing = arg - enum
r0 = enum.collect{|e| Math::pickup0(symbol, *e.to_a, &blk)}
sing = sing.collect{|s| [yield(s),s]} if iterator?
res = (sing + r0).send(symbol)
end
def pickup(symbol, *arg, &blk)
res = Math::pickup0(symbol, *arg, &blk)
if res.is_a? Array
res.pop
else
res
end
end
def min(*arg, &blk)
Math::pickup(:min, *arg, &blk)
end
def max(*arg, &blk)
Math::pickup(:max, *arg, &blk)
end
module_function :min, :max, :pickup, :pickup0
end
if __FILE__ == $0
a = [2,4,3]
b = [5,-1,-3]
p Math::min(1,2,3) #=> 1
p Math::min(a) #=> 2
p Math::max(a) #=> 4
p Math::min(a,b) #=> -3
p Math::max(a,b) #=> 5
p Math::max(a,b){|i| 1.0/i**2} #=> -1
end
-- gotoken