Feature #2540: Hash#contribute
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
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
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