Setting nil to zero

Robert Klemme [mailto:bob.news@gmx.net] :

#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 :slight_smile:

for the record, i played w the ff

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 test.rb

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

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

-botp

#Kind regards

···

#
# robert
#
#
#

Botp wrote:

Robert Klemme [mailto:bob.news@gmx.net] :

#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 :slight_smile:

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

f=Hash.new 0

=> {}

f[:foo]+=1

=> 1

f

=> {:foo=>1}

for the record, i played w the ff

>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

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