Ruby对象的比较、转换与操作
立即解锁
发布时间: 2025-08-16 02:11:48 阅读量: 2 订阅数: 8 


Ruby编程语言核心概念与实践
# Ruby 对象的比较、转换与操作
## 1. 相等性比较
### 1.1 与 Java 的差异
对于 Java 程序员来说,习惯用 `==` 来判断两个对象是否为同一个对象,用 `equals` 方法判断两个不同对象的值是否相等。而 Ruby 的约定与 Java 几乎相反。
### 1.2 常见相等性运算符
#### 1.2.1 `==` 运算符
- **数值类型**:`Numeric` 类在 `==` 运算符中会进行简单的类型转换,例如 `Fixnum` 类型的 1 和 `Float` 类型的 1.0 比较结果为相等。
- **其他类型**:像 `String` 和 `Array` 等类的 `==` 运算符通常要求两个操作数为同一类。若右操作数定义了 `to_str` 或 `to_ary` 转换函数,这些运算符会调用右操作数定义的 `==` 运算符,由该对象决定是否与左操作数相等。
- **`!=` 运算符**:在 Ruby 中用于测试不相等。当 Ruby 遇到 `!=` 时,会先使用 `==` 运算符,然后取反结果。在 Ruby 1.9 中,类可以显式定义自己的 `!=` 运算符。
#### 1.2.2 `eql?` 方法
`eql?` 方法由 `Object` 定义,是 `equal?` 的同义词。重写该方法的类通常将其用作严格版本的 `==`,不进行类型转换。例如:
```ruby
1 == 1.0 # true: Fixnum 和 Float 对象可以相等
1.eql?(1.0) # false: 但它们永远不会 eql!
```
`Hash` 类使用 `eql?` 来检查两个哈希键是否相等。如果两个对象 `eql?` 为真,它们的 `hash` 方法必须返回相同的值。
#### 1.2.3 `===` 运算符
`===` 运算符通常被称为“case 相等”运算符,用于测试 `case` 语句的目标值是否与该语句的任何 `when` 子句匹配。
- **默认行为**:`Object` 定义的默认 `===` 运算符会调用 `==` 运算符。
- **特定类的行为**:
- `Range` 定义 `===` 用于测试一个值是否在范围内。
- `Regexp` 定义 `===` 用于测试一个字符串是否匹配正则表达式。
- `Class` 定义 `===` 用于测试一个对象是否是该类的实例。
- 在 Ruby 1.9 中,`Symbol` 定义 `===` 如果右操作数与左操作数是相同的符号或包含相同文本的字符串,则返回 `true`。
```ruby
(1..10) === 5 # true: 5 在范围 1..10 内
/\d+/ === "123" # true: 字符串匹配正则表达式
String === "s" # true: "s" 是 String 类的实例
:s === "s" # true 在 Ruby 1.9 中
```
#### 1.2.4 `=~` 运算符
`=~` 运算符由 `String` 和 `Regexp`(在 Ruby 1.9 中还有 `Symbol`)定义,用于执行模式匹配,它并非真正的相等运算符。`Object` 定义的 `=~` 版本总是返回 `false`。`!~` 定义为 `=~` 的反运算,在 Ruby 1.9 中可定义,在 Ruby 1.8 中不可定义。
### 1.3 对象顺序
有些类可以定义顺序,即对于该类的任意两个实例,它们要么相等,要么一个实例“小于”另一个。在 Ruby 中,类通过实现 `<=>` 运算符来定义顺序:
- 若左操作数小于右操作数,返回 -1。
- 若两个操作数相等,返回 0。
- 若左操作数大于右操作数,返回 1。
- 若两个操作数无法有意义地比较,返回 `nil`。
```ruby
1 <=> 5 # -1
5 <=> 5 # 0
9 <=> 5 # 1
"1" <=> 5 # nil: 整数和字符串不可比较
```
定义 `<=>` 运算符的类通常会包含 `Comparable` 模块,该模块根据 `<=>` 定义了以下运算符:
| 运算符 | 含义 |
| ---- | ---- |
| `<` | 小于 |
| `<=` | 小于或等于 |
| `==` | 等于
0
0
复制全文
相关推荐










