[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Re: setting nil to zero

Peña, Botp

2/23/2006 10:19:00 AM

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 :)

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


1 Answer

Robert Klemme

2/23/2006 10:48:00 AM

0

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 :)

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
>
> 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

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