```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

```