From: Chris Cummer Date: 2007-12-20T22:20:46+09:00 Subject: Re: Monkey patching a private method? On 20-Dec-07, at 12:19 AM, Jesús Gabriel y Galán wrote: > On Dec 20, 2007 6:25 AM, Wes Gamble wrote: >> Chris Cummer wrote: >>> If I understand correctly what you're intending, you can sort'a get >>> around it via the following technique in which the public >>> priv_meth() >>> over-rides the private one. This is not ideal though since it leaves >>> priv_meth() public. Is this what you're thinking? >>> >> >> Not exactly. I need to modify the body of priv_meth, not expose it >> publicly. > > This works for me: > > irb(main):013:0> class A > irb(main):014:1> def call_a; a; end > irb(main):015:1> private > irb(main):016:1> def a; "a"; end > irb(main):017:1> end > => nil > irb(main):019:0> A.new.public_methods.grep(/\Acall_a\Z|\Aa\Z/) > => ["call_a"] > irb(main):020:0> A.new.call_a > => "a" > irb(main):021:0> class A > irb(main):022:1> private > irb(main):023:1> def a; "new a"; end > irb(main):024:1> end > => nil > irb(main):025:0> A.new.public_methods.grep(/\Acall_a\Z|\Aa\Z/) > => ["call_a"] > irb(main):026:0> A.new.call_a > => "new a" > > So it seems that the private method a can be redefined without > making it public. > Hope this helps, Yep, you're right Jesús. In my example switching to: class TestClass private def priv_meth return "dog" end end redefines it and keeps it private as well. So yes, it does indeed appear that the original poster can do what they want after all.