Ruby 为什么可以';在对象实例的单例类中包含内核

Ruby 为什么可以';在对象实例的单例类中包含内核,ruby,metaprogramming,Ruby,Metaprogramming,在顶层: unbinded_method = method :puts #=> Object(Kernel)#puts(*arg1) 但我做到了 obj = Object.new obj.puts 'wow' obj = Object.new obj.puts 'wow' 我犯了一个未定义的错误 所以我假设内核模块没有包含在obj的singleton类中,所以我做了 obj.instance_eval do include Kernel end 但我又犯了一个错误: No

在顶层:

unbinded_method = method :puts

#=> Object(Kernel)#puts(*arg1)
但我做到了

obj = Object.new

obj.puts 'wow'
obj = Object.new

obj.puts 'wow'
我犯了一个未定义的错误

所以我假设内核模块没有包含在obj的singleton类中,所以我做了

obj.instance_eval do

include Kernel

end
但我又犯了一个错误:

NoMethodError: undefined method `include' for #<Object:0x00000100b14dc8>
NoMethodError:未定义的方法“include”#
为什么我不能在对象实例的单例类中包含内核

嗯,你可以:

但我做到了

obj = Object.new

obj.puts 'wow'
obj = Object.new

obj.puts 'wow'
我犯了一个未定义的错误

不,你没有。这是您得到的错误:

# NoMethodError: private method `puts' called for #<Object:0xdeadbed>
或者只是

obj.send :puts, 'wow' # send cirvumvents access protection
# wow
所以我假设内核模块没有包含在obj的singleton类中[…]

你为什么假设而不只是检查

obj.singleton_class.ancestors.include? Kernel # => true
所以我做了

obj.instance_eval do
  include Kernel
end
但我又犯了一个错误:

NoMethodError: undefined method `include' for #<Object:0x00000100b14dc8>
NoMethodError:未定义的方法“include”#


同样,错误消息已经告诉您需要知道的一切:
对象
没有
include
方法,其祖先链中也没有方法
include
模块
类的一种方法,但是
obj
对象
,而不是
模块

您对私有方法的解释是最好的,对我来说完全有意义,感谢您一直以来的精彩回答@乔格,你能帮我看看吗?