On Nov 2, 8:27 pm, transf... / gmail.com wrote:
> Lets say I have a method using the not-so-uncommon keyword options
> pattern:
>
>   def foo(*args)
>     opts  = (Hash === args.last ? args.pop : {})
>     ...
>
> Now I want to define another method, which is essentially a special
> alias, that places a particular option as the first argument:
>
>   def bar(opt, *args)
>     foo(*args, :baz => opt)  # doesn't work.
>   end
>
> Is there no better way to do this than:
>
>   def bar(opt, *args)
>     opts  = (Hash === args.last ? args.pop : {})
>     opts[:baz] = opt
>     args << opts
>     foo(*args)
>   end
>
> Boy, it really makes you wish we had keyword arguments built-in to the
> language!!! I forget, will we have those in 1.9? If so how the above
> look then?

How flexible do you need to be with the argument handling? Would
something like the following work?

def foo a, b='default', opts={}
  puts "a is #{a}, b is #{b}"
  opts.each {|k,v| puts "#{k} => #{v}"}
  puts '-'*10
end

def bar opt, a, b='default2', opts={}
  foo a, b, opts.merge!({:baz => opt})
end

foo 1
foo 2, 'foo'
foo 3, 'foo', :opt1 => 'one', :opt2 => 'two'
bar 'extra', 4
bar 'extra', 5, 'bar', :opt1 => 'one', :opt2 => 'two'

Brian Adkins