Programming Tutorials

(追記) (追記ここまで)

Using Forwardable in Ruby

By: James Edward Gray II in Ruby Tutorials on 2009年03月03日 [フレーム]

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

SingleForwardable

 printer = String.new
 printer.extend SingleForwardable # prepare object for delegation
 printer.def_delegator "STDOUT", "puts" # add delegation for STDOUT.puts()
 printer.puts "Howdy!"

Prints:

 Howdy!



(追記) (追記ここまで)


Add Comment

JavaScript must be enabled for certain features to work
* Required information
1000

Comments

No comments yet. Be the first!
(追記) (追記ここまで)
(追記) (追記ここまで)

AltStyle によって変換されたページ (->オリジナル) /