From: Steve Tuckner Date: 2001-04-18T01:33:09+09:00 Subject: [ruby-talk:13766] Re: Odd Hash Behavior (long) I am kind of new to Ruby, could you explain the change to the hash class in detail (it might be good for other newbies too)? -----Original Message----- From: ts [mailto:decoux@moulon.inra.fr] Sent: Tuesday, April 17, 2001 11:20 AM To: ruby-talk@ruby-lang.org Cc: ruby-talk@ruby-lang.org Subject: [ruby-talk:13765] Re: Odd Hash Behavior (long) >>>>> "S" == Steve Tuckner writes: S> Could I change the way a hash works so that when a new key is referenced, a S> new object is automatically created. This is very quickly written (verify it) pigeon% cat b.rb #!/usr/bin/ruby class << Hash alias :old_new :new def new(default = nil, &block) a = old_new(default) if block_given? raise "Invalid call" if default a.instance_eval <<-EOT @block = block alias :aref :[] def [](a) if ! has_key?a self[a] = @block[] end aref(a) end EOT end a end end class A attr_reader :value def initialize @value = 0 end def add_one @value += 1 end end aTestHash = Hash.new { A.new } aTestHash['A'] = A.new aTestHash['A'].add_one aTestHash['B'].add_one aTestHash['B'].add_one print "aTestHash['A'] = #{aTestHash['A'].value}\n" print "aTestHash['B'] = #{aTestHash['B'].value}\n" print "\nAll Hash values:\n" aTestHash.each { |aKey, aA| print "#{aKey} = #{aA.value}\n" } pigeon% pigeon% b.rb aTestHash['A'] = 1 aTestHash['B'] = 2 All Hash values: A = 1 B = 2 pigeon% Guy Decoux