ZetCode

Ruby 类关键字

最后修改日期:2025 年 4 月 27 日

本教程将解释如何使用 Ruby 的 class 关键字来创建面向对象程序。类是 Ruby 中基本的构建块。

class 关键字在 Ruby 中定义一个新类。类将数据和行为封装到可重用组件中。它们支持继承和混入(mixins)。

Ruby 类可以包含方法、常量和其他类定义。Ruby 中万物皆对象,类定义了对象的蓝图。

基本类定义

这个例子展示了 Ruby 中最简单的类定义。该类包含一个输出问候语的单一方法。

basic_class.rb
class Greeter
  def greet
    puts "Hello, Ruby!"
  end
end

g = Greeter.new
g.greet

class 关键字开始定义,后跟类名。我们使用 new 创建一个实例,并调用其 greet 方法。类名应为常量(首字母大写)。

带初始化方法的类

initialize 方法在 Ruby 类中充当构造函数。创建新实例时会运行它。此示例自定义了问候语。

initialize_method.rb
class Person
  def initialize(name)
    @name = name
  end

  def greet
    puts "Hello, #{@name}!"
  end
end

p = Person.new("John")
p.greet

initialize 方法接受一个 name 参数。实例变量(@name)存储对象状态。我们将参数传递给 new,它会将它们转发给 initialize

类继承

Ruby 支持使用 < 运算符进行单重继承。此示例展示了一个基类和一个共享行为的派生类。

inheritance.rb
class Animal
  def speak
    puts "Animal sound"
  end
end

class Dog < Animal
  def speak
    puts "Woof!"
  end
end

a = Animal.new
a.speak

d = Dog.new
d.speak

Dog 继承自 Animal,但会覆盖 speak 方法。Ruby 首先在当前类中查找方法,然后在父类中查找。

类变量和类方法

类变量(@@)在所有实例之间共享。类方法使用 self. 前缀定义。这会跟踪实例计数。

class_vars_methods.rb
class Counter
  @@count = 0

  def initialize
    @@count += 1
  end

  def self.total
    @@count
  end
end

3.times { Counter.new }
puts "Total instances: #{Counter.total}"

每次创建新实例时,@@count 都会递增。类方法 total 返回计数。类方法是在类本身上调用的。

访问器方法

Ruby 为 getter/setter 方法提供了快捷方式。attr_readerattr_writerattr_accessor 简化了属性访问。

accessors.rb
class Book
  attr_reader :title
  attr_accessor :author

  def initialize(title, author)
    @title = title
    @author = author
  end
end

b = Book.new("Ruby Guide", "Jane Doe")
puts b.title
b.author = "John Smith"
puts b.author

attr_reader 创建一个 getter,attr_accessor 创建两者。title 是只读的,而 author 可以更改。

模块作为混入(Mixins)

Ruby 类可以包含模块以获得其他功能。此示例展示了一个混入到类中的模块。

mixins.rb
module Loggable
  def log(message)
    puts "[LOG] #{message}"
  end
end

class Product
  include Loggable

  def initialize(name)
    @name = name
    log "Created product: #{@name}"
  end
end

p = Product.new("Laptop")

Product 类从 Loggable 模块获得 log 方法。混入提供了类似多重继承的功能。

单例类

Ruby 允许使用单例类为单个对象定义方法。此示例向一个特定实例添加了一个方法。

singleton_class.rb
class Dog
  def bark
    puts "Woof!"
  end
end

d1 = Dog.new
d2 = Dog.new

def d1.special_bark
  puts "Special woof!"
end

d1.bark
d1.special_bark
d2.bark
# d2.special_bark # Would raise NoMethodError

d1 获得了一个其他 Dog 实例无法使用的方法。单例类对于对象特定的行为很有用。

来源

Ruby 类文档

本教程涵盖了 Ruby 的 class 关键字,并提供了演示核心 OOP 特性(如继承、混入和单例类)的示例。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出 所有 Ruby 教程