面试题答案
一键面试运用Forwardable模块设计委托结构思路
- 引入Forwardable模块:在Ruby中,Forwardable模块提供了一种简洁的方式来定义委托方法。通过
extend Forwardable
,可以使用def_delegator
和def_delegators
方法来定义委托。 - 动态委托目标类:为了实现委托目标类的动态变化,可以在类中定义一个实例变量来存储委托目标对象,并通过方法来设置这个对象。
- 性能优化:减少不必要的方法调用开销,在初始化时尽量确定委托关系,避免在运行时频繁动态查找委托方法。
核心代码片段
require 'forwardable'
class DelegatorClass
extend Forwardable
def initialize
@delegate_target = nil
end
# 设置委托目标对象的方法
def set_delegate_target(target)
@delegate_target = target
end
# 使用def_delegator定义委托方法
def_delegator :@delegate_target, :some_method, :delegated_some_method
# 如果有多个方法需要委托,可以使用def_delegators
def_delegators :@delegate_target, :method1, :method2, :method3
end
# 使用示例
target_obj = Object.new
def target_obj.some_method
"Target's some method result"
end
def target_obj.method1
"Method 1 result"
end
delegator = DelegatorClass.new
delegator.set_delegate_target(target_obj)
puts delegator.delegated_some_method
puts delegator.method1
在上述代码中,DelegatorClass
通过extend Forwardable
使用Forwardable模块功能。set_delegate_target
方法用于动态设置委托目标对象。def_delegator
和def_delegators
分别定义单个和多个委托方法,使得DelegatorClass
的实例可以像调用自身方法一样调用委托目标对象的方法。这样设计既实现了可扩展的委托结构,又在一定程度上优化了性能。