# \[Feature #2540\] Hash#contribute

**URL:** <https://www.ruby-forum.com/t/feature-2540-hash-contribute/180858>\
**Category:** Development\
**Created:** [December 30, 2009, 2:53pm UTC](https://www.ruby-forum.com/t/feature-2540-hash-contribute/180858 "2009-12-30T14:53:10Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Makoto\_Cyross](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b77776/32.png) [@Makoto\_Cyross](https://www.ruby-forum.com/u/Makoto_Cyross)\
**Post date:** [December 30, 2009, 2:53pm UTC](https://www.ruby-forum.com/t/feature-2540-hash-contribute/180858/1 "2009-12-30T14:53:10Z")

</div>

Feature #2540: Hash#contribute  
[http://redmine.ruby-lang.org/issues/show/2540](http://redmine.ruby-lang.org/issues/show/2540)

e$B5/I\<\<Te(B: Makoto Cyross  
e$B%9%F!\<%?%9e(B: Open, e$BM%@hEYe(B: Normal  
e$B%+%F%4%je(B: core, Target version: 1.9.2

e$B=i$a$F%A%1%C%H@Z$j$^$9!#ITHw$,$4$6$$$^$7$?$i$4;XE&$/$@$5$$!#e(B

* * *

e$B8=:\_!“e(BHashe$B$K%-!\<$HCM$r@\_Dj$7$?$$$H$-$K!“e(B[]=e$B$He(Bstoree$B$Ne(B2e$B\<o$N%a%=%C%I$,$”$j$^$9!#e(B  
e$B$7$+$7!”$3$l$i$N%a%=%C%I$O99?7$7$?e(Bselfe$B$rJV$5$J$$$?$a!“e(BHashe$B$r%^!\<%8$9$ke(B(Hash#mergee$B$H$O0c$$!”?\<$/8!:w$9$k%^!\<%8e(B)e$B=hM}$r=q$$$?$H$-$O!"$I$&$7$F$be(B1e$B9T$G\<}$^$i$J$/$J$j$^$9e(B

# base:e$B%^!\<%8$9$k%O%C%7%ee(B

# hash:e$B%^!\<%8BP\>]%O%C%7%ee(B

def merge2(base, hash = {})  
base.each{|key, value| hash[key] = value.kind\_of?(Hash) ? merge(value,  
hash[key].nil? ? {} : hash[key]) : value }  
hash  
end

e$B$=$3$G!"e(BHashe$B$K%-!\<$HCM$r@\_Dj$9$kDI2C$N%a%=%C%I$H$7$F!"e(BHash#contributee$B$rDs0F$$$?$7$^$9!#e(B  
e$B5!G=$O!"e(Bselfe$B$rJV$90J30$Oe(BHash#storee$B$HF1Ey$G$9!#e(B  
e$B$3$l$r;H$&$H$-$O!"e(Binjecte$B$r;H$C$F!"e(B1e$B9T$G:Q$`$h$&$K$J$j$^$9!#e(B

# base:e$B%^!\<%8$9$k%O%C%7%ee(B

# hash:e$B%^!\<%8BP\>]%O%C%7%ee(B

def merge2(base, hash = {})  
base.keys.inject(hash){|r, key| r.contribute(key,  
base[key].kind\_of?(Hash) ? merge2(base[key], r[key].nil? ? {} : r[key])  
: base[key] }  
end

e$B$48!F$$h$m$7$/$\*4j$$$$$?$7$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![Makoto\_Cyross](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b77776/32.png) [@Makoto\_Cyross](https://www.ruby-forum.com/u/Makoto_Cyross)\
**Post date:** [December 30, 2009, 6:46pm UTC](https://www.ruby-forum.com/t/feature-2540-hash-contribute/180858/2 "2009-12-30T18:46:06Z")

</div>

e$B%A%1%C%He(B #2540 e$B$,99?7$5$l$^$7$?!#e(B (by Kazuhiro NISHIYAMA)

> e$B$=$3$G!"e(BHashe$B$K%-!\<$HCM$r@\_Dj$9$kDI2C$N%a%=%C%I$H$7$F!"e(BHash#contributee$B$rDs0F$$$?$7$^$9!#e(B  
> e$B5!G=$O!"e(Bselfe$B$rJV$90J30$Oe(BHash#storee$B$HF1Ey$G$9!#e(B

e$B?7$7$$%a%=%C%I$rDI2C$7$J$/$F$be(Btape$B$r;H$($PNI$$$H;W$$$^$9!#e(B

> e$B$3$l$r;H$&$H$-$O!"e(Binjecte$B$r;H$C$F!"e(B1e$B9T$G:Q$`$h$&$K$J$j$^$9!#e(B

## injecte$B$H$NAH$\_9g$o$;$J$ie(Beach\_with\_objecte$B$r;H$&J}$,NI$$$H;W$$$^$9!#e(B

[http://redmine.ruby-lang.org/issues/show/2540](http://redmine.ruby-lang.org/issues/show/2540)

---

<div class="post-metadata">

**Author:** ![Makoto\_Cyross](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b77776/32.png) [@Makoto\_Cyross](https://www.ruby-forum.com/u/Makoto_Cyross)\
**Post date:** [December 31, 2009, 6:56am UTC](https://www.ruby-forum.com/t/feature-2540-hash-contribute/180858/3 "2009-12-31T06:56:38Z")

</div>

e$B%A%1%C%He(B #2540 e$B$,99?7$5$l$^$7$?!#e(B (by Makoto Cyross)

> > e$B$=$3$G!"e(BHashe$B$K%-!\<$HCM$r@\_Dj$9$kDI2C$N%a%=%C%I$H$7$F!"e(BHash#contributee$B$rDs0F$$$?$7$^$9!#e(B  
> > e$B5!G=$O!"e(Bselfe$B$rJV$90J30$Oe(BHash#storee$B$HF1Ey$G$9!#e(B
> 
> e$B?7$7$$%a%=%C%I$rDI2C$7$J$/$F$be(Btape$B$r;H$($PNI$$$H;W$$$^$9!#e(B
> 
> > e$B$3$l$r;H$&$H$-$O!"e(Binjecte$B$r;H$C$F!"e(B1e$B9T$G:Q$`$h$&$K$J$j$^$9!#e(B
> 
> injecte$B$H$NAH$\_9g$o$;$J$ie(Beach\_with\_objecte$B$r;H$&J}$,NI$$$H;W$$$^$9!#e(B

e$B$40U8+$rH?1G$7$F$\_$^$7$?!#e(B

# base:e$B%^!\<%8$9$k%O%C%7%ee(B

# hash:e$B%^!\<%8BP\>]%O%C%7%ee(B

def merge2(base, hash = {})  
base.each\_with\_object(hash){|pair, r| r.tap{|tmp| tmp[pair[0]] =  
pair[1].kind\_of?(Hash) ? merge2(pair[1], r[pair[0]].nil? ? {} :  
r[pair[0]]) : pair[1] }  
end

## e$B5!G=E\*$K$O$3$l$G==J,$G$9!#$"$j$,$H$&$4$6$$$^$7$?!#e(B

[http://redmine.ruby-lang.org/issues/show/2540](http://redmine.ruby-lang.org/issues/show/2540)
