リスト 6.13 継承とincludeした時のメソッド優先順序
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
:second_include_module
class Klass
define_method :same_name_method, FirstIncludeModule.instance_method(:same_name_method)
end
object = Klass.new
object.same_name_method
:first_include_module
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
:un_include_module_method
class OriginalClass
end
obj = OriginalClass.new
def obj.new_singleton_method
:new_singleton_method
end
:new_singleton_method
obj.class.method_defined? :new_singleton_method
false
obj.singleton_class.method_defined? :new_singleton_method
true
class Klass3; end
p klass = Klass3.new
klass.singleton_class
#<Klass3:0x00007fd7bfb0a1f0>
#<Class:#<Klass3:0x00007fd7bfb0a1f0>>
KLASS_OBJECT = klass
class << klass; self; end == KLASS_OBJECT.singleton_class
true
obj = Object.new
def obj.define_singleton_method
:singleton_method
end
:define_singleton_method
class << obj
end
obj.singleton_class
#<Class:#<Object:0x00007fd7bf9819a0>>
class OriginalClass2
end
obj = OriginalClass2.new
obj.singleton_class.superclass
OriginalClass2
p obj.instance_of? obj.singleton_class
obj.instance_of? OriginalClass2
false
true
1.singleton_class
TypeError: can't define singleton (pry):82:in `singleton_class' (pry):82:in `<main>' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/bin/iruby:5:in `<top (required)>' /Users/ketchup/.rbenv/versions/2.6.0/bin/iruby:23:in `load' /Users/ketchup/.rbenv/versions/2.6.0/bin/iruby:23:in `<main>'
:symbol.singleton_class
TypeError: can't define singleton (pry):83:in `singleton_class' (pry):83:in `<main>' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/bin/iruby:5:in `<top (required)>' /Users/ketchup/.rbenv/versions/2.6.0/bin/iruby:23:in `load' /Users/ketchup/.rbenv/versions/2.6.0/bin/iruby:23:in `<main>'
p true.singleton_class
p false.singleton_class
nil.singleton_class
TrueClass FalseClass
NilClass
class Klass3; end
p klass = Klass.new
p EigenClass = klass.singleton_class
EigenClass.new
#<Klass:0x00007fd7c0a53fa8> #<Class:#<Klass:0x00007fd7c0a53fa8>>
TypeError: can't create instance of singleton class (pry):93:in `new' (pry):93:in `<main>' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/bin/iruby:5:in `<top (required)>' /Users/ketchup/.rbenv/versions/2.6.0/bin/iruby:23:in `load' /Users/ketchup/.rbenv/versions/2.6.0/bin/iruby:23:in `<main>'
class NewClass < EigenClass
end
TypeError: can't make subclass of singleton class (pry):94:in `<main>' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run' /Users/ketchup/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/bin/iruby:5:in `<top (required)>' /Users/ketchup/.rbenv/versions/2.6.0/bin/iruby:23:in `load' /Users/ketchup/.rbenv/versions/2.6.0/bin/iruby:23:in `<main>'
module ExtendedModule
def extend_method
:extend_method
end
end
obj = Object.new
obj.extend ExtendedModule
obj.extend_method
:extend_method
obj = Object.new
p obj.singleton_class.ancestors
obj.extend ExtendedModule
obj.singleton_class.ancestors
[#<Class:#<Object:0x00007fd7bfbd98d8>>, Object, PP::ObjectMixin, JSON::Ext::Generator::GeneratorMethods::Object, Kernel, BasicObject]
[#<Class:#<Object:0x00007fd7bfbd98d8>>, ExtendedModule, Object, PP::ObjectMixin, JSON::Ext::Generator::GeneratorMethods::Object, Kernel, BasicObject]
SINGLETON_OBJECT = Object.new
#<Object:0x00007fd7bfc025d0>
class << SINGLETON_OBJECT
def only_method
:only_method
end
end
:only_method
SingletonClass = SINGLETON_OBJECT.singleton_class
#<Class:#<Object:0x00007fd7bfc025d0>>
def SingletonClass.instance_get
SINGLETON_OBJECT
end
:instance_get
SingletonClass.instance_get.only_method
:only_method