跳转到内容

Ruby 编程/对象介绍

来自维基教科书,开放的书籍,开放的世界

← 编码 | Ruby 基础 →


就像 Smalltalk 一样,Ruby 是一种纯面向对象的语言——一切都是对象。相比之下,像 C++Java 这样的语言是混合语言,将世界划分为对象和 基本类型。混合方法在某些应用程序中可以获得更好的性能,但纯面向对象方法更一致,使用起来更简单。

什么是对象?

[编辑 | 编辑源代码]

使用 Smalltalk 的术语,对象可以执行以下三件事。

  1. 保存状态,包括对其他对象的引用。
  2. 接收消息,来自自身和其他对象。
  3. 在处理消息的过程中,发送消息,既发送给自己,也发送给其他对象。

如果您没有 Smalltalk 背景,用以下方式重新表述这些规则可能更有意义。

  1. 对象可以包含数据,包括对其他对象的引用。
  2. 对象可以包含方法,这些方法是具有对对象数据特权访问权限的函数。
  3. 对象的方法可以调用/运行其他方法/函数。

变量和对象

[编辑 | 编辑源代码]

让我们启动 irb 来更好地理解对象。

$ irb --simple-prompt
>> comedian = "Stephen Colbert"
=> "Stephen Colbert"

在第一行中,我们创建了一个包含文本 "Stephen Colbert" 的 String 对象。我们还告诉 Ruby 使用变量 comedian 来引用这个对象。

接下来,我们告诉 Ruby 也使用变量 favorite_comedian 来引用同一个 String 对象。

>> favorite_comedian = comedian
=> "Stephen Colbert"

现在,我们有两个变量可以用来引用同一个 String 对象——comedianfavorite_comedian。由于它们都引用同一个对象,如果对象发生更改(我们将在下面看到),更改将显示在使用任何一个变量时。

在 Ruby 中,以 感叹号(也称为“惊叹号”)结尾的方法会修改对象。例如,方法 upcase! 将 String 的字母更改为大写。

>> comedian.upcase!
=> "STEPHEN COLBERT"

由于变量 comedianfavorite_comedian 都指向同一个 String 对象,因此我们可以使用任何一个变量看到新的、大写的文本。

>> comedian
=> "STEPHEN COLBERT"
>> favorite_comedian
=> "STEPHEN COLBERT"

不以感叹号结尾的方法会返回数据,但不会修改对象。例如,downcase! 通过将所有字母改为小写来修改 String 对象。但是,downcase 会返回 String 的小写副本,但原始字符串保持不变。

>> comedian.downcase
=> "stephen colbert"
>> comedian
=> "STEPHEN COLBERT"

由于原始对象仍然包含文本 "STEPHEN COLBERT",您可能想知道新的 String 对象(带有小写文本)去了哪里。好吧,irb 打印出其内容后,由于我们没有分配变量来跟踪它,因此无法再访问它。它基本上消失了,Ruby 会处理掉它。

重新分配变量

[编辑 | 编辑源代码]

但是,如果你的最喜欢的喜剧演员不是 Stephen Colbert 呢?让我们将 favorite_comedian 指向一个新的对象。

>> favorite_comedian = "Jon Stewart"
=> "Jon Stewart"

现在,每个变量都指向一个不同的对象。

假设我们再次改变主意。现在,我们最喜欢的喜剧演员是 Ellen DeGeneres

>> favorite_comedian = "Ellen DeGeneres"
=> "Ellen DeGeneres"

现在,没有变量再指向 "Jon Stewart" String 对象了。因此,Ruby 会处理掉它。

华夏公益教科书