From: Kevin Barnes Date: 2007-09-15T05:53:57+09:00 Subject: confusion over 1.8.5 and 1.8.6 behavior of private I noticed some interesting behavior when implementing some metaprogramming techniques with private. This is dependent on why's metaid gem/library. I have included metaid at the end in case folks are not familiar with it. In 1.8.5 the output is: true true true In 1.8.6 the output is: true true false require 'metaid' module NoSeeUm def self.included(base) base.extend(ClassMethods) end module ClassMethods def see(name) meta_eval do define_method("#{name}_public") { puts "I'm public" } define_method("#{name}_private") { puts "I'm private" } private ("#{name}_private").to_sym private define_method("#{name}_maybe_private") { puts "I may be private" } end end end end class Reveal include NoSeeUm see :me end p Reveal.public_methods.include?('me_public') p Reveal.private_methods.include?('me_private') p Reveal.private_methods.include?('me_maybe_private') ### Metaid ### # Metaid == a few simple metaclass helper # (See http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html.) class Object # The hidden singleton lurks behind everyone def metaclass; class << self; self; end; end def meta_eval &blk; metaclass.instance_eval &blk; end # Adds methods to a metaclass def meta_def name, &blk meta_eval { define_method name, &blk } end # Defines an instance method within a class def class_def name, &blk class_eval { define_method name, &blk } end end Just wondering why the me_maybe_private method doesn't show up in the list of private methods in 1.8.6? Which version of Ruby is 'right'? Thanks, Kevin