From: cichol@... Date: 2015-12-16T15:29:03+00:00 Subject: [ruby-core:72188] [Ruby trunk - Bug #11826] After prepending a module, rewrite Hash#[] takes no effect for calls like Hash.new[:a] Issue #11826 has been updated by cichol tsai. Subject changed from In 'prepended', 'class_eval' rewriting a method take no effect to After prepending a module, rewrite Hash#[] takes no effect for calls like Hash.new[:a] ruby -v set to ruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32] ~~~ module M end class Hash prepend M end class Hash def [](k) p 3 end def map p 4 end end h = {a: 1} h[:a] #=> return 1 and without print 3 h.send(:[], :a) #=> print 3 h.map # => print 4 ~~~ A shorter snippet for the issue. It seems like an issue only for [] method, maybe something about syntax. But if use 'include' instead of 'prepend', the 'h[:a]' can give an output. Please help me check if it is a bug, sorry for bothering. ---------------------------------------- Bug #11826: After prepending a module, rewrite Hash#[] takes no effect for calls like Hash.new[:a] https://bugs.ruby-lang.org/issues/11826#change-55600 * Author: cichol tsai * Status: Open * Priority: Normal * Assignee: * ruby -v: ruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32] * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN ---------------------------------------- ~~~ module M def self.prepended(clz) clz.class_eval do def [](k) p 1 end end end end module N def self.included(clz) clz.class_eval do def []=(k, v) p 2 end end end end class Hash prepend M include N end Hash.new[1] Hash.new[1]=1 ~~~ Running this example gives no output, which is expected to be '1 2'. I am using 'ruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32]'. Thanks in advanced. -- https://bugs.ruby-lang.org/