[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Hash.new({}) astonishment

Marcello Barnaba

2/16/2007 3:57:00 AM

>> h = Hash.new({})
=> {}
>> h[:a][:b] = 1
=> 1
>> h
=> {}
>> h[:a]
=> {:b=>1}
>> h.keys
=> []
>> h.values
=> []

??
--
pub 1024D/8D2787EF 723C 7CA3 3C19 2ACE 6E20 9CC1 9956 EB3C 8D27 87EF

4 Answers

Edwin Fine

2/16/2007 4:26:00 AM

0

Marcello Barnaba wrote:
>>> h = Hash.new({})
> => {}
>>> h[:a][:b] = 1
> => 1
>>> h
> => {}
>>> h[:a]
> => {:b=>1}
>>> h.keys
> => []
>>> h.values
> => []
>
> ??

http://www.ruby-doc.org/core/classes/Hash.src/M0...
Hash.new(obj) => aHash
If obj is specified, this single object will be used for all default
values.

irb(main):001:0> h = Hash.new({})
=> {}
irb(main):002:0> h[:a] = 12345 # default object = 12345
=> 12345
irb(main):003:0> h[:b] = 45678 # default object = 45678
=> 45678
irb(main):004:0> h[:a]
=> 12345
irb(main):005:0> efine@ender:~/ruby/ckjm$ irb
irb(main):001:0> h = Hash.new({})
=> {}
irb(main):002:0> h[:a][:b] = 12345 # single default object now = 12345
=> 12345
irb(main):003:0> h
=> {}
irb(main):004:0> h[:xyzzy]
=> {:b=>12345}
irb(main):005:0> h[0]
=> {:b=>12345}
irb(main):006:0> h[0].object_id == h[:xyzzy].object_id
=> true
irb(main):007:0> h[109123].object_id == h[:not_there].object_id
=> true
irb(main):008:0> h
=> {}
irb(main):009:0> h = Hash.new {|hash,key| hash[key] = {}}
=> {}
irb(main):010:0> h[:a][:b] = 12345
=> 12345
irb(main):011:0> h
=> {:a=>{:b=>12345}}
irb(main):012:0> h.keys
=> [:a]
irb(main):013:0> h.values
=> [{:b=>12345}]

--
Posted via http://www.ruby-....

Edwin Fine

2/16/2007 4:28:00 AM

0

Sorry, middle button operator trouble :)

irb(main):001:0> h = Hash.new({})
=> {}
irb(main):002:0> h[:a][:b] = 12345 # single default object now = 12345
=> 12345
irb(main):003:0> h
=> {}
irb(main):004:0> h[:xyzzy]
=> {:b=>12345}
irb(main):005:0> h[0]
=> {:b=>12345}
irb(main):006:0> h[0].object_id == h[:xyzzy].object_id
=> true
irb(main):007:0> h[109123].object_id == h[:not_there].object_id
=> true
irb(main):008:0> h
=> {}
irb(main):009:0> h = Hash.new {|hash,key| hash[key] = {}}
=> {}
irb(main):010:0> h[:a][:b] = 12345
=> 12345
irb(main):011:0> h
=> {:a=>{:b=>12345}}
irb(main):012:0> h.keys
=> [:a]
irb(main):013:0> h.values
=> [{:b=>12345}]


--
Posted via http://www.ruby-....

Robert Dober

2/16/2007 6:25:00 AM

0

On 2/16/07, Marcello Barnaba <bofh@softmedia.info> wrote:
> >> h = Hash.new({})
> => {}
> >> h[:a][:b] = 1
You are assigning to the {}, gotten by the [:a]
look at this
irb#1(main):014:0> h[:a][:b]=42
=> 42
irb#1(main):015:0> o
=> {:b=>42}
irb#1(main):016:0> h
=> {}
irb#1(main):017:0>
irb#1(main):018:0*
irb#1(main):019:0* o={}
=> {}
irb#1(main):020:0> h=Hash.new(o)
=> {}
irb#1(main):021:0> h[:a][:b]=42
=> 42
irb#1(main):022:0> h[:c]=42
=> 42
irb#1(main):023:0> h
=> {:c=>42}
irb#1(main):024:0> o
=> {:b=>42}

or maybe even better

h=Hash.new({})
=> {}
irb#1(main):027:0> h[:a][:b]=42
=> 42
irb#1(main):028:0> h.default
=> {:b=>42}

It is completely normal that h is empty you were working with it's
default property

HTH
Robert
--
We have not succeeded in answering all of our questions.
In fact, in some ways, we are more confused than ever.
But we feel we are confused on a higher level and about more important things.
-Anonymous

Marcello Barnaba

2/16/2007 8:16:00 AM

0

Hi,

On Friday 16 February 2007 05:26, Edwin Fine wrote:
> If obj is specified, this single object will be used for all default
> values.

yuck. i got it. thanks :).
--
pub 1024D/8D2787EF 723C 7CA3 3C19 2ACE 6E20 9CC1 9956 EB3C 8D27 87EF