module SingleForwardable
SingleForwardable 也可以用于在对象级别设置委托。
printer = String.new printer.extend SingleForwardable # prepare object for delegation printer.def_delegator "STDOUT", "puts" # add delegation for STDOUT.puts() printer.puts "Howdy!"
此外,SingleForwardable 还可以用于为类或模块设置委托。
class Implementation def self.service puts "serviced!" end end module Facade extend SingleForwardable def_delegator :Implementation, :service end Facade.service #=> serviced!
如果你想同时使用 Forwardable 和 SingleForwardable,你可以使用 def_instance_delegator 和 def_single_delegator 等方法。
Public Instance Methods
Source
# File lib/forwardable.rb, line 305 def def_single_delegator(accessor, method, ali = method) gen = Forwardable._delegator_method(self, accessor, method, ali) instance_eval(&gen) end
定义一个方法method,该方法委托给accessor(即调用accessor中同名的方法)。如果提供了new_name,则将其用作委托方法的名称。返回已定义方法的名称。
也别名为: def_delegator
Source
# File lib/forwardable.rb, line 291 def def_single_delegators(accessor, *methods) methods.each do |method| next if /\A__(?:send|id)__\z/ =~ method def_single_delegator(accessor, method) end end
用于定义多个委托方法的快捷方式,但不能用于使用不同的名称。以下两个代码示例具有相同的效果
def_delegators :@records, :size, :<<, :map def_delegator :@records, :size def_delegator :@records, :<< def_delegator :@records, :map
也别名为: def_delegators
Source
# File lib/forwardable.rb, line 270 def single_delegate(hash) hash.each do |methods, accessor| unless defined?(methods.each) def_single_delegator(accessor, methods) else methods.each {|method| def_single_delegator(accessor, method)} end end end
也别名为: delegate