Ruby如何在语义上处理分配?

Ruby中,我们使用=运算符赋值给对象.

结合隐式打字,我们经常会遇到这样的情况:

myVar= :asymbol

上述两行都创建一个新的符号对象,并将对象绑定到变​​量名myVar.

从语法上讲,怎么做?

我已经把它敲入了我的头,这个=操作符并不是解释器内置的魔术语法,而是实际上只是对象的句法糖.=(value)方法.

考虑到这一点,我最好的猜测是,当解释器看到我们正在尝试为一个未定义的变量名赋值时,它首先创建一个特殊类型的新对象,如未定义或null或者某些东西,然后传递: =该对象的消息,其中有效负载是我们尝试分配的值.

然而,在未实例化的对象上调用.class会抛出异常,因为Ruby认为我们正在尝试调用一个方法(其名称是您想要存在的变量的名称)

> obj.class
    > NameError: undefined variable or method 'obj' for main:Object

所以,据我所知,我无法通过实验弄清楚这一点.

边注:

在符号分配的情况下,我相信分配的值(AKA是实例化对象的object_id方法返回的值,在C级别为无符号长度VALUE变量的值的AKA)是表示某个表中的偏移量的数字(我相信这是Ruby如何实现符号对象的“即时价值”).

在其他情况下,该值可能是对象本身的直接编码,也可能是引用一个结构体来转换为指针的值.

无论如何,Ruby代表对象的方式,以及我们最终分配引用还是对象本身都不是我在此问的.

附加问题:

什么类是=继承的方法?我在ObjectBasicObject的规格中找不到.

解决方法

在技​​术意义上,变量只是指向对象的指针.没有什么显着的,但是对现有对象的简单变量赋值并不涉及发送任何方法调用或消息.

记住变量就在这里,以便程序员可以通过名称而不是某种内部标识符或内存位置来引用对象.所以这里有一些“魔法”,=在做一个作业时是特别的,因为你可以在左边和右边做一些规则.

您可以将消息发送到某种东西(即方法调用)的唯一方法是,如果您以编译器了解的方式定义它. x = 1就足够了,这意味着x是指所讨论的Fixnum.

请注意,Ruby解释器将需要确定x是否指向变量或方法调用,因为x =可以是在对其进行评估的对象上下文中定义的方法.

例如:

class Example
  def x=(value)
    @x = value
  end

  def test
    # Equivalent to send(:x=,1) because x= is a method
    x = 1

    # Is a variable deFinition because y= is not a method
    y = 2

    # Is always a method call because self is referenced.
    self.x = 3
  end
end

# Is a variable deFinition because x= is not defined in this context
x = 4

如果您的对象没有x =方法,则x被自动推定为一个变量.

你不能有一个:=消息,因为这意味着你可以用另一个替换一个对象,这是不允许的.一旦创建了一个对象,它就不能神奇地改变类型.为此,您需要创建一个不同对象的新实例.变量只显示改变类型,但实际上它们只是指向不同的对象.

所以简而言之,没有:=方法调用,但可能有一些特殊的方法,如:x =在非常具体的情况下工作.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...