Ruby 编程/对象介绍
就像 Smalltalk 一样,Ruby 是一种纯面向对象的语言——一切都是对象。相比之下,像 C++ 和 Java 这样的语言是混合语言,将世界划分为对象和 基本类型。混合方法在某些应用程序中可以获得更好的性能,但纯面向对象方法更一致,使用起来更简单。
使用 Smalltalk 的术语,对象可以执行以下三件事。
- 保存状态,包括对其他对象的引用。
- 接收消息,来自自身和其他对象。
- 在处理消息的过程中,发送消息,既发送给自己,也发送给其他对象。
如果您没有 Smalltalk 背景,用以下方式重新表述这些规则可能更有意义。
- 对象可以包含数据,包括对其他对象的引用。
- 对象可以包含方法,这些方法是具有对对象数据特权访问权限的函数。
- 对象的方法可以调用/运行其他方法/函数。
让我们启动 irb
来更好地理解对象。
$ irb --simple-prompt >> comedian = "Stephen Colbert" => "Stephen Colbert"
在第一行中,我们创建了一个包含文本 "Stephen Colbert
" 的 String 对象。我们还告诉 Ruby 使用变量 comedian
来引用这个对象。
接下来,我们告诉 Ruby 也使用变量 favorite_comedian
来引用同一个 String 对象。
>> favorite_comedian = comedian => "Stephen Colbert"
现在,我们有两个变量可以用来引用同一个 String 对象——comedian
和 favorite_comedian
。由于它们都引用同一个对象,如果对象发生更改(我们将在下面看到),更改将显示在使用任何一个变量时。
在 Ruby 中,以 感叹号(也称为“惊叹号”)结尾的方法会修改对象。例如,方法 upcase!
将 String 的字母更改为大写。
>> comedian.upcase! => "STEPHEN COLBERT"
由于变量 comedian
和 favorite_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 会处理掉它。