Last Modified
2016-08-02 17:58:23 -0500


delegate – Support for the Delegation Pattern

Documentation by James Edward Gray II and Gavin Sinclair


This library provides three different ways to delegate method calls to an object. The easiest to use is SimpleDelegator. Pass an object to the constructor and all methods supported by the object will be delegated. This object can be changed later.

Going a step further, the top level DelegateClass method allows you to easily setup delegation through class inheritance. This is considerably more flexible and thus probably the most common use for this library.

Finally, if you need full control over the delegation scheme, you can inherit from the abstract class Delegator and customize as needed. (If you find yourself needing this control, have a look at forwardable, also in the standard library. It may suit your needs better.)


Be advised, RDoc will not detect delegated methods.

delegate.rb provides full-class delegation via the DelegateClass() method. For single-method delegation via def_delegator(), see forwardable.rb.



Here’s a simple example that takes advantage of the fact that SimpleDelegator’s delegation object can be changed at any time.

class Stats
  def initialize
    @source =[])

  def stats( records )

    "Elements:  #{@source.size}\n" +
    " Non-Nil:  #{@source.compact.size}\n" +
    "  Unique:  #{@source.uniq.size}\n"

s =
puts s.stats(%w{James Edward Gray II})
puts s.stats([1, 2, 3, nil, 4, 5, 1, 2])


Elements:  4
 Non-Nil:  4
  Unique:  4

Elements:  8
 Non-Nil:  7
  Unique:  6


Here’s a sample of use from tempfile.rb.

A Tempfile object is really just a File object with a few special rules about storage location and/or when the File should be deleted. That makes for an almost textbook perfect example of how to use delegation.

class Tempfile < DelegateClass(File)
  # constant and class member data initialization...

  def initialize(basename, tmpdir=Dir::tmpdir)
    # build up file path/name in var tmpname...

    @tmpfile =, File::RDWR|File::CREAT|File::EXCL, 0600)

    # ...


    # below this point, all methods of File are supported...

  # ...


SimpleDelegator’s implementation serves as a nice example here.

class SimpleDelegator < Delegator
  def initialize(obj)
    super             # pass obj to Delegator constructor, required
    @_sd_obj = obj    # store obj for future use

  def __getobj__
    @_sd_obj          # return object we are delegating to, required

  def __setobj__(obj)
    @_sd_obj = obj    # change delegation object, a feature we're providing

  # ...

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit

blog comments powered by Disqus