好的!以下是关于 Ruby 类和对象 的详细讲解。Ruby 是一种纯粹的面向对象语言,一切皆对象,类是创建对象的基础。我会从基础概念入手,逐步介绍类的定义、对象的使用以及相关特性,结合中文示例帮助你理解。


1. 什么是类和对象?

  • 类(Class):类是对象的蓝图,定义了对象的属性(数据)和行为(方法)。
  • 对象(Object):对象是类的实例,通过类创建的具体实体。

在 Ruby 中,类本身也是对象(Class 类的实例)。


2. 定义一个类

使用 class 关键字定义类,类名以大写字母开头(驼峰命名)。

基本示例

class Person
  def say_hello
    "你好,我是一个人!"
  end
end

# 创建对象
p = Person.new
puts p.say_hello  # 你好,我是一个人!
  • new 方法创建类的实例。
  • say_hello 是实例方法,对象可以调用。

3. 实例变量和初始化

使用 initialize 方法

initialize 是类的构造函数,在对象创建时自动调用。实例变量以 @ 开头,属于对象。

class Person
  def initialize(name)
    @name = name  # 实例变量
  end

  def say_hello
    "你好,我是 #{@name}!"
  end
end

p = Person.new("张三")
puts p.say_hello  # 你好,我是 张三!

注意

  • 实例变量未赋值时默认为 nil
  class Person
    def get_name
      @name
    end
  end
  p = Person.new
  puts p.get_name  # nil

4. 属性访问器

手动编写 getter 和 setter 很繁琐,Ruby 提供了便捷方法:

  • attr_reader:只读(getter)
  • attr_writer:只写(setter)
  • attr_accessor:读写(getter 和 setter)

示例

class Person
  attr_accessor :name, :age  # 自动生成 getter 和 setter

  def initialize(name, age)
    @name = name
    @age = age
  end
end

p = Person.new("李四", 25)
puts p.name      # 李四
puts p.age       # 25
p.name = "王五"  # 修改 name
puts p.name      # 王五

5. 类方法和类变量

类方法

类方法属于类本身,用 self. 定义,不需要实例化即可调用。

class Person
  def self.say_hello
    "你好,这是类方法!"
  end
end

puts Person.say_hello  # 你好,这是类方法!

类变量

类变量以 @@ 开头,在类的所有实例间共享。

class Person
  @@count = 0  # 类变量

  def initialize(name)
    @name = name
    @@count += 1
  end

  def self.get_count
    "已创建 #{@@count} 个对象"
  end
end

p1 = Person.new("张三")
p2 = Person.new("李四")
puts Person.get_count  # 已创建 2 个对象

6. 继承

Ruby 支持单继承,用 < 符号指定父类。

示例

class Animal
  def speak
    "我是一个动物"
  end
end

class Dog < Animal
  def speak
    "汪汪!"
  end
end

dog = Dog.new
puts dog.speak  # 汪汪!

调用父类方法

使用 super

class Dog < Animal
  def speak
    super + " 我是狗!"
  end
end

dog = Dog.new
puts dog.speak  # 我是一个动物 我是狗!

7. 模块(Mixin)

模块(module)类似于类的集合,可以被包含在类中,提供代码复用。

示例

module Greetable
  def greet
    "你好!"
  end
end

class Person
  include Greetable  # 包含模块
end

p = Person.new
puts p.greet  # 你好!

注意

  • 模块不能直接实例化,只能被类 includeextend

8. 对象的方法和特性

每个对象都有一些内置方法:

  • class:返回对象的类
  • object_id:返回对象的唯一标识
  • methods:列出对象的所有方法

示例

p = Person.new
puts p.class       # Person
puts p.object_id   # 一个数字(对象 ID)
puts p.methods     # 列出所有方法

9. 中文支持示例

Ruby 的类和对象天然支持中文:

class 学生
  attr_accessor :姓名

  def initialize(姓名)
    @姓名 = 姓名
  end

  def 自我介绍
    "大家好,我是 #{@姓名}!"
  end
end

s = 学生.new("张三")
puts s.自我介绍  # 大家好,我是 张三!
puts s.姓名      # 张三

10. 访问控制

Ruby 支持三种访问级别:

  • public:默认,任何地方可访问。
  • private:只能在类内部调用。
  • protected:类及其子类可访问。

示例

class Person
  def initialize(name)
    @name = name
  end

  def public_method
    "公开方法:#{@name}"
  end

  private
  def private_method
    "私有方法"
  end

  protected
  def protected_method
    "受保护方法"
  end
end

p = Person.new("李四")
puts p.public_method    # 公开方法:李四
# puts p.private_method  # 错误:私有方法不可外部调用

11. 实践示例

示例 1:简单学生类

class Student
  attr_accessor :name, :grade

  def initialize(name, grade)
    @name = name
    @grade = grade
  end

  def info
    "#{@name} 的成绩是 #{@grade}"
  end
end

s = Student.new("王五", "A")
puts s.info  # 王五 的成绩是 A

示例 2:带类方法的计数器

class Counter
  @@total = 0

  def initialize
    @@total += 1
  end

  def self.total
    @@total
  end
end

c1 = Counter.new
c2 = Counter.new
puts Counter.total  # 2

下一步

  • 试试代码:告诉我你想练习哪部分(例如属性、继承或模块),我可以设计例子。
  • 问题解答:对类或对象有疑问吗?直接问我!
  • 深入学习:想了解更多高级特性(比如元编程或单例类)吗?我可以继续讲解。

你现在想做什么?写代码、问问题,还是其他?