module FirstIncludeModule def same_name_method :first_include_module end end module SecondIncludeModule def same_name_method :second_include_module end end class Klass include FirstIncludeModule include SecondIncludeModule end object = Klass.new object.same_name_method class Klass define_method :same_name_method, FirstIncludeModule.instance_method(:same_name_method) end object = Klass.new object.same_name_method module UnIncludeModule def un_include_module_method :un_include_module_method end end class Klass2 # TypeErrr にならない define_method :un_include_module_method, UnIncludeModule.instance_method(:un_include_module_method) end object = Klass2.new object.un_include_module_method class OriginalClass end obj = OriginalClass.new def obj.new_singleton_method :new_singleton_method end obj.class.method_defined? :new_singleton_method obj.singleton_class.method_defined? :new_singleton_method class Klass3; end p klass = Klass3.new klass.singleton_class KLASS_OBJECT = klass class << klass; self; end == KLASS_OBJECT.singleton_class obj = Object.new def obj.define_singleton_method :singleton_method end class << obj end obj.singleton_class class OriginalClass2 end obj = OriginalClass2.new obj.singleton_class.superclass p obj.instance_of? obj.singleton_class obj.instance_of? OriginalClass2 1.singleton_class :symbol.singleton_class p true.singleton_class p false.singleton_class nil.singleton_class class Klass3; end p klass = Klass.new p EigenClass = klass.singleton_class EigenClass.new class NewClass < EigenClass end module ExtendedModule def extend_method :extend_method end end obj = Object.new obj.extend ExtendedModule obj.extend_method obj = Object.new p obj.singleton_class.ancestors obj.extend ExtendedModule obj.singleton_class.ancestors SINGLETON_OBJECT = Object.new class << SINGLETON_OBJECT def only_method :only_method end end SingletonClass = SINGLETON_OBJECT.singleton_class def SingletonClass.instance_get SINGLETON_OBJECT end SingletonClass.instance_get.only_method