oop/basic_object/answers_nothing.rb
tests/_examples/oop/basic_object/answers_nothing.rb in the metorex repository.
# An object rooted at BasicObject answers only what BasicObject defines.
# Everything Kernel and Object add arrives through Object, which such a class
# never inherits from.
held = BasicObject.new
begin
held.to_s
rescue NoMethodError => refused
puts(refused.message)
end
# A method taken from Kernel and bound onto one still runs.
p(::Kernel.instance_method(:frozen?).bind(held).call)
p(::Kernel.instance_method(:class).bind(held).call)
# A class rooted there may take Kernel on, and then it answers everything
# Kernel defines.
class WithKernel < BasicObject
include ::Kernel
end
p(WithKernel.new.frozen?)
# A class may also take a single one of Kernel's methods on.
class OnlyRespondTo < BasicObject
define_method(:respond_to?, ::Kernel.instance_method(:respond_to?))
def named
:named
end
end
asked = OnlyRespondTo.new
p([asked.respond_to?(:named), asked.respond_to?(:missing)])
Output:
undefined method 'to_s' for an instance of BasicObject
false
BasicObject
false
[true, false]