代码之家  ›  专栏  ›  技术社区  ›  AlbertMunichMar

字符串和符号的Ruby不变性(如果我们将它们存储在变量中怎么办)

  •  1
  • AlbertMunichMar  · 技术社区  · 7 年前

    字符串是基本类型;无论何时调用字符串,它都有一个新的对象id;无论何时创建符号,都会创建指向该值的指针。

    var1 = :foo
    var1.object_id # => 2598748
    :foo.object_id # => 2598748
    
    var2 = :foo
    var2.object_id # => 2598748
    
    var2 = "hello"
    var2.object_id # => 70131755422100
    

    我怎么可能创建第二个变量 var2 ,并且它的对象id与 var1 ? 我创建了第二个元素。这是否意味着变量也是指针?

    :foo . 符号 :foo 只存储一次,对吗?

    创建了两个变量,因此它们应该在内存中,并且它们不能在同一个位置,因为它们有不同的名称。 变量2 需要存储,以便我稍后给他们打电话。如果他们有相同的对象id,我不知道怎么给他们打电话。如果有人能帮我理解这一点,我会很感激的。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Community Mohan Dere    5 年前

    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

    推荐文章