[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Re: "Joining" strings which may be nil (or) Handling Option hashes

e

2/13/2005 5:25:00 PM

> Lähettäjä: "Robert Klemme" <bob.news@gmx.net>
> Aihe: Re: "Joining" strings which may be nil (or) Handling Option hashes
>
>
> "Gavri Fernandez" <gavri.fernandez@gmail.com> schrieb im Newsbeitrag
> news:e3ecfac705021308253ae8704e@mail.gmail.com...
> > Hi everyone,
> > I want to create a query based on options passed in through
> > an options hash to my method.
> >
> > The query would look like
> > "title:ruby and author:dave and publisher:oreilly"
> > or
> > "title:ruby and publisher:addison-wesley"
> > or
> > "author:dave"
> > or some other combination based on what options have been set in the hash.
> >
> > options[:author] |= "" followed by Array#join doesn't help me
> > because it would lead to successive 'and's in the query.
> >
> > What is the Ruby Idiom to achieve what I want?
>
> Lots of, here are some:
>
> >> opts = {"title"=>"ruby", "author"=>"dave", "publisher"=>"oreilly",
> >> "foo"=>nil}
> => {"title"=>"ruby", "author"=>"dave", "foo"=>nil, "publisher"=>"oreilly"}
> >> opts.select{|k,v|v}
> => [["title", "ruby"], ["author", "dave"], ["publisher", "oreilly"]]
> >> opts.select{|k,v|v}.map{|k,v| "#{k}=#{v}"}.join(" and ")
> => "title=ruby and author=dave and publisher=oreilly"
>
> Here's a more efficient variant - using #inject of course :-)
>
> >> opts.inject(nil){|s,(k,v)| v ? (s ? s << " and " : "") << k << "=" << v :
> >> s}
> => "title=ruby and author=dave and publisher=oreilly"

Or, possibly more legibly:

hsh.to_a.map!{|i| i.join('=')}.join(' and ')

?

> Kind regards
>
> robert

E