# How to modify Hash to track key insertions?

**URL:** <https://www.ruby-forum.com/t/how-to-modify-hash-to-track-key-insertions/48718>\
**Category:** Ruby\
**Created:** [November 23, 2005, 8:24pm UTC](https://www.ruby-forum.com/t/how-to-modify-hash-to-track-key-insertions/48718 "2005-11-23T20:24:29Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![jgbailey](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/dfb087/32.png) [@jgbailey](https://www.ruby-forum.com/u/jgbailey)\
**Post date:** [November 23, 2005, 8:24pm UTC](https://www.ruby-forum.com/t/how-to-modify-hash-to-track-key-insertions/48718/1 "2005-11-23T20:24:29Z")

</div>

I am trying to figure out how I can modify the Hash object so that I am  
notified each time a key is inserted in a Hash when it is constructed  
using the syntax below:

a = { “x” =\> “1”, “y” =\> “2” }

I’ve tried overriding []=, but that will only get called when the Hash  
is constructed explicitly.

Here’s a little bit of code showing what I’ve tried and the output I’d  
like to see. Thanks for any help!

class Hash  
alias :old\_assignment :[]=  
def []=(key, value)  
puts “#{key} =\> #{value}”  
old\_assignment(key, value)  
end  
end

puts “Creating a”  
a = { “x” =\> “1”, “y” =\> “2” }  
puts “Creating b”  
b = Hash.new  
b[“1”] = “x”  
b[“2”] = “y”

# Expected output

# Creating a

# x =\> 1

# y =\> 2

# Creating b

# 1 =\> x

# 2 =\> y

# Actual output

# Creating a

# Creating b

# 1 =\> x

# 2 =\> y

p.s. I’m ultimately doing this to get to an OrderedHash. I looked at  
Ara’s code but the problem is I need to _replace_ the functionality of  
Hash - it’s not an option for me to explicitly create an OrderedHash  
object.  
p.p.s. Is there a way to avoid the alias statement for []=? For some  
reason, calling super in there would give a NoMethodError.

---

<div class="post-metadata">

**Author:** ![jgbailey](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/dfb087/32.png) [@jgbailey](https://www.ruby-forum.com/u/jgbailey)\
**Post date:** [November 23, 2005, 8:44pm UTC](https://www.ruby-forum.com/t/how-to-modify-hash-to-track-key-insertions/48718/2 "2005-11-23T20:44:36Z")

</div>

m4dc4p wrote:

> like to see. Thanks for any help!  
> a = { “x” =\> “1”, “y” =\> “2” }
> 
> # 1 =\> x
> 
> Hash - it’s not an option for me to explicitly create an OrderedHash  
> object.  
> p.p.s. Is there a way to avoid the alias statement for []=? For some  
> reason, calling super in there would give a NoMethodError.

Personally I’d like to see (private?) methods Hash#get and Hash#set that  
should be used internally for getting and setting values. That way,  
you’d only have to override one method when wanting to change Hash’s  
behaviour.

class StrHash  
def set(key, value)  
raise TypeError unless value.respond\_to? :to\_str  
super(key, value.to\_str)  
end  
end

In your case:

class Hash  
alias\_method : **set** , :set

```
 def set(key, value)
   puts "#{key} => #{value}"
   __set__ (key, value)
 end

```

end

Cheers,  
Daniel

---

<div class="post-metadata">

**Author:** ![jgbailey](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/dfb087/32.png) [@jgbailey](https://www.ruby-forum.com/u/jgbailey)\
**Post date:** [November 24, 2005, 9:30am UTC](https://www.ruby-forum.com/t/how-to-modify-hash-to-track-key-insertions/48718/3 "2005-11-24T09:30:19Z")

</div>

m4dc4p wrote:

> like to see. Thanks for any help!

> p.s. I’m ultimately doing this to get to an OrderedHash. I looked at  
> Ara’s code but the problem is I need to _replace_ the functionality of  
> Hash - it’s not an option for me to explicitly create an OrderedHash  
> object.

It’s usually difficult to fiddle with built in classes as they employ  
some  
optimizations. What’s the problem with replacing “h = {1=\>2, 3=\>4}” by  
“h  
= OrdererdHash.create(1=\>2, 3=\>4)”? Note that if you manipulate the  
hash  
constructor {} you’ll affect _all_ hashes created in your app and libs -  
something which might produce side effects (even if it’s “only”  
performance) you don’t want.

My 0.02 EUR: stick with the explicit approach and drop manipulating  
built  
in constructs.

Kind regards

```
robert
```
