Ruby:变量在Ruby中是对象吗?

6
我听说在Ruby中一切都是对象。我在面试中回答变量也是一个对象,但面试官否认了我的回答。有人知道真相吗?

为什么有这个减号?我说的答案是正确的。 - shajin
1
我应该向谁询问?面试官说:“不,Ruby中的变量不是对象。”因此,我想知道真相。请把我当作新手来考虑。 - shajin
@prusswan 请参考正确答案。 - shajin
5个回答

13

"在Ruby中,几乎所有东西都是对象"基本上是正确的。

但更准确地说,我会说任何可以赋值给变量或从方法返回的值都是一个对象。一个变量是一个对象吗?不完全是。变量只是一个对象的名称(也称为“指针”),它允许您在内存中找到该对象并对其进行操作。

shajin = Person.new()
在这段代码片段中,我们有一个变量shajin,它指向一个对象(人类类的一个实例)。该变量仅仅是一个对象的标识符,而不是对象本身。
我认为这是一个诡异的问题。最终,面向对象是人类用于理解复杂程序的特性,但计算机本身并非面向对象。深入到足够多的层次,任何语言中对象都将不存在。
因此,也许更公平的说法是:"在Ruby中,一切重要的东西都是对象"。

11

为何不直接查看源代码呢?Ruby语言规范非常明确和显而易见(本人加粗):

6.2 变量

6.2.1 概述

变量由名称表示,并引用称为变量的值的对象。变量本身不是一个对象。


2
请问您能否提供该文本的链接? - Art Shayderov

2

2
我们首先需要了解的是Ruby是一种完全面向对象的语言。每个值都是一个对象(...)。 (《Ruby编程语言》,Flanagan和Matsumoto,第2页)请注意,这本由语言创造者共同撰写的书并没有声明“所有东西都是对象”。
a = 1

1是一个对象,'a'是对1对象的引用。如果'a'本身是一个对象,它将有自己的object_id。但是:

1.object_id #=> 3
a.object_id #=> 3

此外,方法并不是真正的对象(但如果需要,您可以将它们转换为对象)。

有没有一种方法可以将一个方法转换为对象,或者你只是说将 Ruby 方法重构为对象很简单? - Roman Davis
1
@RomanDavis 是的,有一种方法可以将方法转换为对象。它就是 method 方法。obj = 1.method(:+) - steenslag
真的很酷。我试图编辑解释方法不是真正对象的部分,并附上一个链接,因为一开始它让我感到困惑。如果值得你花时间,你可以自己改变它。 - Roman Davis

0

@Alex Wayne和@Jörg W Mittag的回答是正确的,但我想补充一点,即“不是所有”重要的东西都是对象。例如,方法和块不是对象,但可以通过method方法和proc分别转换为对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接