Ruby 之方法委托

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
相关推荐
予枫的编程笔记7 小时前
从入门到精通:RabbitMQ全面解析与实战指南
java·开发语言·后端·rabbitmq·ruby
时空无限1 天前
EFK 中使用 ruby 和 javascript 脚本去掉日志中颜色字符详解
linux·javascript·elk·ruby
掘根1 天前
【消息队列项目】客户端四大模块实现
开发语言·后端·ruby
lhrimperial8 天前
RabbitMQ核心技术深度解析
分布式·rabbitmq·ruby
小鸡脚来咯8 天前
RabbitMQ详解(从入门到实战)
开发语言·后端·ruby
云和数据.ChenGuang11 天前
OpenEuler系统下RabbitMQ安装与基础配置教程
服务器·分布式·rabbitmq·ruby·数据库运维工程师·运维教程
云和数据.ChenGuang11 天前
Deepseek适配场景:OpenEuler系统下RabbitMQ安装与基础配置教程
分布式·rabbitmq·ruby
武子康11 天前
Java-207 RabbitMQ Direct 交换器路由:RoutingKey 精确匹配、队列多绑定与日志分流实战
java·消息队列·rabbitmq·erlang·ruby·java-rabbitmq
武子康12 天前
Java-204 RabbitMQ Connection/Channel 工作流程:AMQP 发布消费、抓包帧结构与常见坑
java·分布式·消息队列·rabbitmq·ruby·java-activemq
武子康13 天前
Java-203 RabbitMQ 生产者/消费者工作流程拆解:Connection/Channel、默认交换器、ACK
java·分布式·消息队列·rabbitmq·erlang·ruby·java-rabbitmq