用途
该技能用于处理 Ruby 的面向对象编程特性,包括类(class)、模块(module)、继承(inheritance)、混入(mixin)以及方法可见性(method visibility)。Ruby 是纯面向对象语言,一切皆对象。当需要编写或理解 Ruby 的类结构、模块复用、继承层次与方法封装时,可参考本技能。
主要能力
类定义
- 基本类结构:类变量(
@@count,所有实例共享)、常量(MAX_AGE)、类方法(def self.count)、构造器(initialize)、实例变量(@name)、实例方法。 - 属性访问器:
attr_accessor(读写)、attr_reader(只读)、attr_writer(只写)。
方法可见性
public:默认,公开方法。protected:可被同类或子类实例调用。private:仅可在本实例内部调用。
示例中 BankAccount 类通过 protected 定义 log_transaction,通过 private 定义 format_currency。
继承
- 单继承:
class Dog < Animal,子类可重写父类方法。 - 使用
super调用父类方法或父类构造器。 - 方法重写与
super:子类Car在initialize中调用super(brand),在start_engine中调用super。
模块与混入
- 模块作为命名空间:
module MyApp; module Utils,通过MyApp::Utils.format_date调用。 - 模块作为混入:
include Swimmable将模块方法作为实例方法加入类。 extend与include的区别:include添加为实例方法,extend添加为类方法。
高级 OOP 模式
- 单例模式:通过
private_class_method :new与self.instance实现,确保Database.instance返回同一对象。 method_missing动态方法:动态处理 getter/setter,并配合respond_to_missing?。- 类实例变量:使用
class << self与attr_accessor管理类级别状态。 Struct:定义带方法的数据结构,如Person = Struct.new(:name, :age)。OpenStruct:动态属性对象,需require 'ostruct'。- 组合优于继承:
Car组合Engine与Wheels实例。 Comparable:实现<=>后可使用sort等方法。Enumerable:在标题中提及,正文未展开具体示例。- 类变量与实例变量对比:
@@count为类变量(共享),@instances为类实例变量(不与子类共享)。
使用方式
该技能以代码示例形式呈现各主题的写法,可直接参考示例中的类定义、模块混入、继承与 super 调用、可见性修饰符、单例实现、method_missing、Struct/OpenStruct、Comparable 等模式来编写 Ruby 代码。
适用场景
- 编写或重构 Ruby 类与模块。
- 设计继承层次或选择组合/混入方案。
- 需要封装实现细节、控制方法可见性时。
- 需要动态方法、单例或简单数据结构时。
- 需要让自定义类支持排序或比较时。
限制与注意事项
- 资料未提供安装命令、依赖版本、运行环境或平台要求。
- 资料未提供收费、价格或授权信息。
- 资料未提供性能数据或效果保证。
- 资料中的最佳实践与反模式为建议性内容,未提供具体验证数据。
Enumerable仅在标题中提及,正文未给出具体示例。
最佳实践(资料所列)
- 复杂关系优先使用组合而非继承。
- 使用模块混入在无关类之间共享行为。
- 保持类小而专注(单一职责原则)。
- 使用
attr_accessor/reader/writer代替手写 getter/setter。 - 使用
private/protected封装实现细节。 - 优先使用实例变量而非类变量,避免意外共享。
- 简单数据对象使用
Struct而非完整类。 - 重写
to_s以提供有意义的字符串表示。
反模式(资料所列)
- 不必要地使用类变量(会在继承层次中共享)。
- 创建上帝对象。
- 暴露内部状态。
- 过度使用继承。
- 忽略可见性修饰符。
相关技能
ruby-metaprogramming:动态类/方法生成。ruby-blocks-procs-lambdas:函数式编程模式。ruby-modules:高级模块用法。