【发布时间】:2015-06-27 16:32:11
【问题描述】:
在 Ruby 中,我们使用 = 运算符为对象赋值。
将此与隐式类型结合起来,我们经常会遇到这样的情况:
myVar= :asymbol
以上行都创建了一个新的符号对象,并将该对象绑定到变量名myVar。
从语义上讲,这是怎么做到的?
我已经意识到= 运算符是不是解释器内置的魔术语法,但实际上只是object.=(value) 方法的语法糖。
考虑到这一点,我最好的猜测是,当解释器看到我们试图为未定义的变量名赋值时,它首先会创建一个特殊类型的新对象,例如 undefined 或 null 或一些东西,然后将:= 消息传递给该对象,其中有效负载是我们尝试分配的值。
但是,在未实例化的对象上调用 .class 只会引发异常,因为 Ruby 认为我们正在尝试调用一个方法(其名称是您要创建的变量的名称) self
> obj.class
> NameError: undefined variable or method 'obj' for main:Object
所以,据我所知,我无法通过实验解决这个问题。
旁注:
在符号赋值的情况下,我相信赋值的值(又名实例化对象的object_id方法返回的值,又名unsigned long VALUE在C级别上的变量的值)是一个代表一个数字在某处的表格中偏移(我相信这就是 Ruby 为符号对象实现“即时价值”的方式)。
在其他情况下,该值可能是对象本身的直接编码,或者是要转换为引用 struct 的指针的值。
无论如何,Ruby 表示对象的方式以及我们最终是分配引用还是对象本身都不是我在这里要问的。
补充问题:
= 方法继承自哪个类?我在 Object 或 BasicObject 的规范中找不到它。
【问题讨论】:
-
像“没有勺子”,没有
=方法。 -
@GeorgeStocker 引用的问题是关于
=运算符的效果,而我的问题是关于它在Ruby 中的实现。
标签: ruby variable-assignment assignment-operator