oop/basic_object/constants.rb
tests/_examples/oop/basic_object/constants.rb in the metorex repository.
# A class descending from BasicObject never reaches top-level constants,
# because Ruby finds those among Object's own. A leading `::` still does.
class Bare < BasicObject
def self.sees_kernel
defined?(Kernel)
end
def self.sees_kernel_at_top_level
::Kernel.name
end
include ::Kernel
end
puts Bare.sees_kernel.inspect
puts Bare.sees_kernel_at_top_level
begin
class Bare
Kernel
end
rescue NameError => error
puts error.message
end
instance = Bare.new
instance.instance_variable_set(:@stored, :value)
puts instance.instance_variable_get(:@stored).inspect
puts instance.respond_to?(:hash).to_s
puts BasicObject.const_defined?(:Kernel).to_s
puts BasicObject.constants(false).inspect
puts BasicObject::BasicObject.name
puts Object.constants(false).include?(:BasicObject).to_s
metaclass = class << BasicObject; self; end
puts metaclass.instance_of?(Class).to_s
puts metaclass.superclass.name
::TopLevelBinding = Class.new
puts TopLevelBinding.name
Output:
nil
Kernel
uninitialized constant Kernel
:value
true
false
[:BasicObject]
BasicObject
true
true
Class
TopLevelBinding