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
是对象
,而不是模块
您对私有方法的解释是最好的,对我来说完全有意义,感谢您一直以来的精彩回答@乔格,你能帮我看看吗?