Ruby变量是对对象的引用,因此当您向一个变量发送一个方法时,它引用的对象就是在其中进行计算的上下文。看第一张图片可能会更清楚,在最高评级的答案(低于公认的答案)
here
.
所以,为了弄清楚发生了什么,让我们深入研究一下文档,看看代码片段会发生什么。
鲁比的
Symbol
课程文件:
https://ruby-doc.org/core-2.5.0/Symbol.html
Symbol对象表示Ruby解释器中的名称和一些字符串。它们是使用:name和:“string”文本语法生成的,并且是通过各种to\ sym方法生成的。
在程序执行期间,将为给定的名称或字符串创建相同的符号对象,而不管该名称的上下文或含义如何。
因此,如果Fred在一个上下文中是常量,在另一个上下文中是方法,在第三个上下文中是类,那么符号:Fred在所有三个上下文中都是同一个对象。
鲁比的
Object#object_id
文档:
https://ruby-doc.org/core-2.5.1/Object.html#method-i-object_id
返回对象的整数标识符。
下面是一步步发生的事情:
# We create two variables that refer to the same object, :foo
var1 = :foo
var2 = :foo
var1.object_id = 2598748
var2.object_id = 2598748
# Evaluated as:
# var1.object_id => :foo.object_id => 2598748
# var2.object_id => :foo.object_id => 2598748
正如上面第一个链接中所讨论的,Ruby是传递值,但每个值都是一个
Object
,所以两个变量的值都相同。因为每个符号都是由相同的字符串组成的(
"foo"
在这种情况下)引用相同的对象,并且
对象#对象id