ACM@UIUC TIL logo ACM@UIUC TIL

Ruby has a BasicObject class which doesn’t include Kernel methods and acts as the parent for all Objects. You can see the ancestry in practice via:

Object.ancestors # => [Object, Kernel, BasicObject]
BasicObject.ancestors # => [BasicObject]

BasicObject thus has very few instance methods which would be inherited by a subclass:

BasicObject.instance_methods # => [:==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__]
Object.instance_methods.length # => 55

This is useful for delegators which would otherwise not delegate methods such as #to_s.

Example:

class ListDelegator
  def initialize(*list)
    @list = list
  end

  def method_missing(method, *args, &block)
    @list.map do |item|
      item.__send__(method, *args, &block)
    end
  end
end

class ListDelegatorBasic < BasicObject
  def initialize(*list)
    @list = list
  end

  def method_missing(method, *args, &block)
    @list.map do |item|
      item.__send__(method, *args, &block)
    end
  end
end

class Out
  def to_s
    "Out"
  end
end

ListDelegator.new(Out.new).to_s # => "#<ListDelegator2:0x007fcab400d148>"
ListDelegatorBasic.new(Out.new).to_s # => ["Out"]