Ruby中的单个符号到多个标识符

Ruby中的单个符号到多个标识符,ruby,Ruby,在“基础扎实的红宝石家第二版”中,大卫·布莱克指出(第239页): 符号表就是这样:一个符号表。它不是一个对象表如果您将标识符用于多种用途,例如作为局部变量和方法名-相应的符号在符号表中仍然只出现一次 然后,作者继续给出以下示例: >> Symbol.all_symbols.size => 3118 >> abc = 1 => 1 >> Symbol.all_symbols.size => 3119 >> def abc; end

在“基础扎实的红宝石家第二版”中,大卫·布莱克指出(第239页):

符号表就是这样:一个符号表。它不是一个对象表如果您将标识符用于多种用途,例如作为局部变量和方法名-相应的符号在符号表中仍然只出现一次

然后,作者继续给出以下示例:

>> Symbol.all_symbols.size
=> 3118
>> abc = 1
=> 1
>> Symbol.all_symbols.size
=> 3119
>> def abc; end
=> :abc
>> Symbol.all_symbols.size
=> 3119
我的问题有两个方面:

  • 如何可能为多个目的使用相同的标识符我知道Ruby知道哪一个是基于上下文的,但这足够了吗
  • 上面示例中创建的符号,它指的是哪个标识符?局部变量还是方法名

  • 我没有读过这本书,但前两句话似乎指的是你问的同样的问题:

    符号表就是这样:一个符号表。它不是一个对象表

    换句话说-符号可以是标识符的名称,但它们不是标识符,也没有与标识符直接(无上下文)的1:1映射

    foo
    是一个标识符<代码>:foo只是该标识符的名称


  • 怎么可能有两个人叫约翰?这只是一个名字,不是身份证
  • 约翰这个名字指的是谁?取决于上下文。在本例中-变量

  • 如果这个问题在本质上不是概念性的,我可以更详细地了解实际的解决方法是如何在语言中发生的。

    好问题

    让我们一个一个地解开这个

    • “如何可能为多个目的使用相同的标识符!?”
    • 所创建的符号,它指的是哪个标识符
    让我先从看起来更熟悉的代码开始

    显然,我们可以使用相同的字符串
    str
    在两个哈希中存储两个对象

    str = "max"
    people[str] = Person.new
    statistics[str] = 42
    
    现在,您的示例代码执行完全相同的操作

    # pseudo-code
    sym = :abc  
    locals[sym] = 1
    methods[sym] = Method.new(...)
    
    Ruby内部使用哈希表示所有内容

    • 所有类都有一个散列
    • 对于每个类,都有一个包含所有方法的哈希
    • 对于每个实例,都有一个包含所有实例变量的哈希
    • 对于每个方法激活,都有一个包含所有局部变量的哈希
    • 等等
    符号被用作这些散列的键,同样地,相同的符号可以多次用于映射到许多散列中的许多内容。就像Rails应用程序中的代码在许多不同的散列对象中使用相同的字符串作为键一样

    现在符号有些特别了。
    :abc
    只有一个实例,Ruby使用一个散列,另一个散列-所谓的符号表-将所有符号映射到一个内部幻数。然后这些神奇的数字在内部被用来表示符号。我想这就是为什么这本书的作者写了“符号表不是对象表。”

    将字符串
    “abc”
    映射到这些内部数字被称为“插入”,因此符号有时被称为插入字符串

    有趣的是,你可以自己用
    :symbol.object\u id
    查找这些神奇的数字,甚至可以根据数字的顺序推断哪些符号是最先创建的


    希望这能回答您的问题:)

    您也不止一次使用数字。您可以将
    1
    赋值给变量(
    abc=1
    ),并将其用作数组索引(
    ary[1]
    ),而不会出现任何问题。现在,
    1
    是指变量值还是指数组索引?当然都有,谢谢。这很有道理!