From: David Masover Date: 2009-04-03T08:13:39+09:00 Subject: Re: Nilling for GC On Thursday 02 April 2009 16:46:37 Eleanor McHugh wrote: > hs.delete_if { |k, v| (v.map! { |worker| thread_dead?(worker) ? > (cleaned += 1; nil) : worker }.compact! || v).empty? } > > It always bugs me that compact! returns nil if no changes occur, > rather than the enum as I seem to use this particular idiom a lot *sigh* It could also be written like this, if I understand it: hs.delete_if { |k, v| (v.map! { |worker| thread_dead?(worker) ? (cleaned += 1; nil) : worker }.tap(&:compact!).empty? } I don't feel strongly about compact! -- after all, it may be useful to know whether it found anything. But this is exactly what tap is for, right? For those on 1.8.6: class Object def tap yield self self end end