ruby 方法委托的优点在于,可以将多个不同实例(或类)的方法组织在一起,然后进行统一调用,方便各类方法的统一管理。比如下边示例中的 color 和 username,本来是不同类里边的方法,但最后都可以统一使用 Man 的实例进行调用。
实例方法委托
ruby
require 'forwardable'
class Person
attr_accessor :name, :sex # attr_accessor相当于attr_reader和attr_writer的合集,实际上是在定义类成员变量的时候就给他定义了一个get和set方法。
def initialize(name, sex)
@name, @sex = name, sex
end
def username
@name
end
end
class Color
attr_accessor :color
def initialize(color)
@color = color
end
end
class Man
extend Forwardable
def_delegators :@person, :username, :sex # 将 username 和 sex 方法委托给 @person,在 Man 实例上调用 username 方法相当于调用 @person 的 username 方法
def_delegators :@color, :color # 将 color 方法委托给 @color,在 Man 实例上调用 color 方法相当于调用 @color 的 color 方法
def initialize()
@person = Person.new("Looking", "male")
@color = Color.new("white")
end
end
man = Man.new
puts man.username # Looking
puts man.sex # male
puts man.color # white
类方法委托
ruby
require 'forwardable'
class Person
def initialize()
end
def self.nickname
self.name + " nickname"
end
end
class Man
extend SingleForwardable
def_delegators :Person, :nickname # 将 nickname 类方法委托给 Person,在 Man 类中直接调用 nickname 类方法相当于调用 Person 的 nickname 方法
def initialize()
end
end
puts Man.nickname # Person nickname