| Path: | lib/forwardable.rb |
| Last Update: | Tue Jan 22 17:22:08 -0600 2008 |
forwardable.rb -
$Release Version: 1.1$
$Revision: 14912 $
by Keiju ISHITSUKA(keiju@ishitsuka.com)
original definition by delegator.rb
Revised by Daniel J. Berger with suggestions from Florian Gross.
Documentation by James Edward Gray II and Gavin Sinclair
This library allows you delegate method calls to an object, on a method by method basis.
Be advised, RDoc will not detect delegated methods.
forwardable.rb provides single-method delegation via the def_delegator() and def_delegators() methods. For full-class delegation via DelegateClass(), see delegate.rb.
Forwardable makes building a new class based on existing work, with a proper interface, almost trivial. We want to rely on what has come before obviously, but with delegation we can take just the methods we need and even rename them as appropriate. In many cases this is preferable to inheritance, which gives us the entire old interface, even if much of it isn‘t needed.
class Queue
extend Forwardable
def initialize
@q = [ ] # prepare delegate object
end
# setup prefered interface, enq() and deq()...
def_delegator :@q, :push, :enq
def_delegator :@q, :shift, :deq
# support some general Array methods that fit Queues well
def_delegators :@q, :clear, :first, :push, :shift, :size
end
q = Queue.new
q.enq 1, 2, 3, 4, 5
q.push 6
q.shift # => 1
while q.size > 0
puts q.deq
end
q.enq "Ruby", "Perl", "Python"
puts q.first
q.clear
puts q.first
Prints:
2 3 4 5 6 Ruby nil
Forwardable can be used to setup delegation at the object level as well.
printer = String.new printer.extend Forwardable # prepare object for delegation printer.def_delegator "STDOUT", "puts" # add delegation for STDOUT.puts() printer.puts "Howdy!"
Prints:
Howdy!
| SingleForwardable | = | Forwardable | compatibility |
ruby-doc.org is hosted and maintained by James Britt and Happy Camper Studios, a Ruby application development company in Phoenix, Arizona. The site was created in 2002 as part of the Ruby Documentation Project to promote the Ruby language and to help other Ruby hackers.
Documentation content on ruby-doc.org is provided by remarkable members of the Ruby community.
For more information on the Ruby programming language, visit ruby-lang.org.
Want to help improve Ruby's API docs? See Ruby Documentation Guidelines.