From: matt@... (matt neuburg) Date: 2008-08-30T08:50:07+09:00 Subject: Re: assignment operator that treats empty and nil as the same thing scooterm@hotmail.com wrote: > ### test1 > otest = {}; > otest['first_name'] ||= 'homer'; > puts otest.inspect; > > ### test2 > otest = {'first_name'=>''}; > otest['first_name'] ||= 'homer'; > puts otest.inspect; > > Problem: test1 produces the correct output, but test2 produces > unwanted output (the value remains as an empty string). I realize that > ruby treats the empty string as "true" ... nevertheless I want to find > an assignment operator in ruby that treats nil and empty exactly the > same way, with the behavior shown in test1. > > Question: Is there a way to do this in ruby *without* resorting to an > if statement or some other construct such as: > > otest['first_name'] = (otest['first_name'].empty?) 'homer' : > otest['first_name']; > > I would like to handle this with a *single* assignment operator, just > like you can do in test1. Would it suffice to subvert Hash in such a way that the value of an element whose value is the empty string is reported as nil? class Hash alias_method "origfetch", "[]" def [](what) result = origfetch(what) if result == '' nil else result end end end h = {"hey"=>"", "ho"=>"ha"} h["hey"] ||= "homer" p h If that's too strong, you can devise your own function: class Hash def set_if_empty(k,v) cur = self[k] if cur.nil? || cur == '' self[k] = v end end end h = {"hey"=>"", "ho"=>"ha"} h.set_if_empty("hey", "homer") p h -- matt neuburg, phd = matt@tidbits.com, http://www.tidbits.com/matt/ Leopard - http://www.takecontrolbooks.com/leopard-customizing.html AppleScript - http://www.amazon.com/gp/product/0596102119 Read TidBITS! It's free and smart. http://www.tidbits.com