好的!以下是关于 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 # 你好!
注意
- 模块不能直接实例化,只能被类
include
或extend
。
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
下一步
- 试试代码:告诉我你想练习哪部分(例如属性、继承或模块),我可以设计例子。
- 问题解答:对类或对象有疑问吗?直接问我!
- 深入学习:想了解更多高级特性(比如元编程或单例类)吗?我可以继续讲解。
你现在想做什么?写代码、问问题,还是其他?
发表回复