Forum: Ruby Re: setting nil to zero

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Peña, Botp (Guest)
on 2006-02-23 12:20
(Received via mailing list)
Robert K. [mailto:removed_email_address@domain.invalid] :

#f[w] = (f[w] || 0) + 1

clear rubyish solution, Robert.
thanks again for generous help.

i am still hoping for the plain f[w] += 1 though :)

for the record, i played w the ff

ruby>cat test.rb

class NilClass
   def method_missing(methId, *args)
      str = methId.id2name
      if str == "+" and args[1].nil?
         #str is "+"
         #args[1]  is nil
         #args[0]  is rhs value
         return args[0]
      end
   end
end

f = {}
f["test"] += 1
f["test2"] += 2
p f

f = []
f[1] += 1
f[5] += 2
p f


ruby>ruby test.rb
{"test2"=>2, "test"=>1}
[nil, 1, nil, nil, nil, 2]

ruby>

I doubted if it's robust enough, so my q...

-botp


#Kind regards
#
#    robert
#
#
#
Robert K. (Guest)
on 2006-02-23 12:53
(Received via mailing list)
Botp wrote:
> Robert K. [mailto:removed_email_address@domain.invalid] :
>
> #f[w] = (f[w] || 0) + 1
>
> clear rubyish solution, Robert.
> thanks again for generous help.
>
> i am still hoping for the plain f[w] += 1 though :)

As mentioned already you can do that, if it's a Hash:

>> f=Hash.new 0
=> {}
>> f[:foo]+=1
=> 1
>> f
=> {:foo=>1}

>          #args[0]  is rhs value
>          return args[0]
>       end
>    end
> end

Why so complicated?  Why not just

class NilClass
  def +(n) n end
end

>> h={}
=> {}
>> h[:foo]+=1
=> 1
>> h
=> {:foo=>1}

Note, I recommend to use the veriant with 0 as default value for Hash
lookups because that avoids tampering with standard classes.

Cheers

    robert
This topic is locked and can not be replied to.