Support for the Ruby 2.1 series ended on March 31 2017. See here for details.

In Files

  • delegate.rb

Parent

BasicObject

Methods

Class/Module Index [+]

Quicksearch
No matching classes.

Object

Public Instance Methods

DelegateClass(superclass) click to toggle source

The primary interface to this library. Use to setup delegation when defining your class.

class MyClass < DelegateClass(ClassToDelegateTo) # Step 1
 def initialize
 super(obj_of_ClassToDelegateTo) # Step 2
 end
end

Here's a sample of use from Tempfile which is really a File object with a few special rules about storage location and 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.open(tmpname, File::RDWR|File::CREAT|File::EXCL, 0600)
 # ...
 super(@tmpfile)
 # below this point, all methods of File are supported...
 end
 # ...
end
 
 # File delegate.rb, line 383
def DelegateClass(superclass)
 klass = Class.new(Delegator)
 methods = superclass.instance_methods
 methods -= ::Delegator.public_api
 methods -= [:to_s,:inspect,:=~,:!~,:===]
 klass.module_eval do
 def __getobj__ # :nodoc:
 unless defined?(@delegate_dc_obj)
 return yield if block_given?
 __raise__ ::ArgumentError, "not delegated"
 end
 @delegate_dc_obj
 end
 def __setobj__(obj) # :nodoc:
 __raise__ ::ArgumentError, "cannot delegate to self" if self.equal?(obj)
 @delegate_dc_obj = obj
 end
 methods.each do |method|
 define_method(method, Delegator.delegating_block(method))
 end
 end
 klass.define_singleton_method :public_instance_methods do |all=true|
 super(all) - superclass.protected_instance_methods
 end
 klass.define_singleton_method :protected_instance_methods do |all=true|
 super(all) | superclass.protected_instance_methods
 end
 return klass
end
 

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