Robert Klemme
1/30/2006 9:06:00 AM
David N. Welton wrote:
> Hi,
>
> foo = { 'a' => 1, 'b' => '', 'c' => 23213 }
>
> bar = Hash[*foo.find_all { |k, v| !v.to_s.empty? }.flatten]
>
> 1) The flatten isn't quite what I want, although it will work in my
> case.
>
> 2) Is there an even better way to be doing this? It's starting to be
> a lot of stuff in one line, so perhaps it's best to just do it in a
> few lines and opt for clarity. But I'm completely new to Ruby, so
> I'd also like advice on 'style'...
Dunno whether it's better in this case, but of course there's a solution
with #inject:
>> foo = { 'a' => 1, 'b' => '', 'c' => 23213 }
=> {"a"=>1, "b"=>"", "c"=>23213}
>> bar=foo.inject({}){|h,(k,v)| h[k]=v unless v.to_s.empty?; h}
=> {"a"=>1, "c"=>23213}
You can as well use delete_if to modify foo in place:
>> foo.delete_if {|k,v| v.to_s.empty?}
=> {"a"=>1, "c"=>23213}
>> foo
=> {"a"=>1, "c"=>23213}
Kind regards
robert