Overwriting hash key

How can get Ruby to tell me when I’m overwriting an existing key in my
hash?

For example,

h = { “key1” => [6, 44, 12],
“key2” => [8, 1],
.
.
}

The hash could get big enough where I accidentally add a new entry,

     "key1" => [99, 3]

when what I needed to do was add [99, 3] to key1’s array. I won’t get
any warning that the first occurrence of key1 is being replaced.

On Sep 19, 2008, at 6:37 PM, jim wrote:

The hash could get big enough where I accidentally add a new entry,

    "key1" => [99, 3]

when what I needed to do was add [99, 3] to key1’s array. I won’t get
any warning that the first occurrence of key1 is being replaced.

Well, if you always have arrays for the values, you can start with:

h = Hash.new {|h,k| h[k] = []}

Then initialize your hash with:

h.update({ “key1” => [6, 44, 12],
“key2” => [8, 1],

})

Then you can:
h[“key1”] << 99 << 3
h[“key1”].concat([99, 3])
h[“key1”].push(99, 3)

h[“key1”] has [6,44,12,99,3]

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

jim wrote:
(…)

The hash could get big enough where I accidentally add a new entry,

     "key1" => [99, 3]

when what I needed to do was add [99, 3] to key1’s array. I won’t get
any warning that the first occurrence of key1 is being replaced.

Here you go:

class SafeHash <Hash
def []=(k,v)
if self.keys.include?(k) then
print “Are you really, sure you want to overwrite #{k.to_s}? (Y/N)”
STDOUT.flush
super(k,v) if gets.chomp.downcase == “y”
else
super(k,v)
end
end
end

h = SafeHash.new
h[“key1”] = [99,3]
h[“key1”] = [12,4]
p h

Regards,

Siep