On 02.01.2007 17:20, Florian Gross wrote:
> Peter Lynch wrote:
> 
>> I would like to know if a function has been called with or without an
>> optional argument.
> 
> Not very pretty:

But clever!

> def fun(a, b = (no_b = true; 5))
>   if no_b then
>     "Fun(%p): %p" % [a, b]
>   else
>     "Fun(%p, %p)" % [a, b]
>   end
> end
> 
> fun(1) # => "Fun(1): 5"
> fun(1, 2) # => "Fun(1, 2)"

The only other reasonable alternative I can see is this:

def fun(a,*bb)
   if bb.empty?
     puts "no b"
   else
     puts "b=#{b}"
   end
end

Note that the other approach that has been mentioned cannot reliably 
detect whether the parameter was set or not:

def fun(a,b=nil)
   if b.nil?
     puts "no b"
   else
     puts "b=#{b}"
   end
end

irb(main):013:0> fun 1
no b
=> nil
irb(main):014:0> fun 1,2
b=2
=> nil
irb(main):015:0> fun 1,nil
no b
=> nil

(The last one should have printed "b=".)

You get more options if you want to use named parameters (i.e. a Hash):

def fun(args={})
   a = args[:a]
   b = args[:b]

   if args.has_key? :b
     puts "b=#{b}"
   else
     puts "no b"
   end
end

irb(main):053:0> fun(:a=>1)
no b
=> nil
irb(main):054:0> fun(:a=>1, :b=>2)
b=2
=> nil
irb(main):055:0> fun(:b=>2)
b=2
=> nil

Kind regards

	robert