On Jun 28, 2006, at 1:15 PM, Daniel Berger wrote:

> Hi all,
>
> I'm trying to associate non-symbol arguments with the most  
> immediately previous symbol.  The solution below works, but I  
> suspect there's an easier way:
>
> def test(*args)
>    hash = {}
>    current = nil
>    args.each{ |arg|
>       if arg.is_a?(Symbol)
>          hash[arg] = []
>          current = arg
>       else
>          hash[current] << arg
>       end
>    }
>
>    hash
> end
>
> hash = test(:foo, 1, :bar, 'a', 7, :baz, /hello/, Fixnum)
>
> p hash # {:foo=>[1], :bar=>["a", 7], :baz=>[/hello/, Fixnum]}
>
> Any ideas?  Some Array#assoc trick I'm missing?
>
> Thanks,
>
> Dan
>
>
> This communication is the property of Qwest and may contain  
> confidential or
> privileged information. Unauthorized use of this communication is  
> strictly prohibited and may be unlawful.  If you have received this  
> communication in error, please immediately notify the sender by  
> reply e-mail and destroy all copies of the communication and any  
> attachments.
>

Well this isn't any easier but it does use inject:

% cat ruby_hashbuild.rb
def test(*args)
   args.inject([Hash.new{|h,k| h[k] = []}, nil]) do |(hash,  
current_key), val|
     case val
     when Symbol
       current_key = val
     else
       hash[current_key] << val
     end
     [hash,  current_key]
   end.first
end

hash = test(:foo, 1, :bar, 'a', 7, :baz, /hello/, Fixnum)
p hash

% ruby ruby_hashbuild.rb
{:bar=>["a", 7], :baz=>[/hello/, Fixnum], :foo=>[1]}