Ruby中的单个符号到多个标识符
在“基础扎实的红宝石家第二版”中,大卫·布莱克指出(第239页): 符号表就是这样:一个符号表。它不是一个对象表如果您将标识符用于多种用途,例如作为局部变量和方法名-相应的符号在符号表中仍然只出现一次 然后,作者继续给出以下示例:Ruby中的单个符号到多个标识符,ruby,Ruby,在“基础扎实的红宝石家第二版”中,大卫·布莱克指出(第239页): 符号表就是这样:一个符号表。它不是一个对象表如果您将标识符用于多种用途,例如作为局部变量和方法名-相应的符号在符号表中仍然只出现一次 然后,作者继续给出以下示例: >> Symbol.all_symbols.size => 3118 >> abc = 1 => 1 >> Symbol.all_symbols.size => 3119 >> def abc; end
>> Symbol.all_symbols.size
=> 3118
>> abc = 1
=> 1
>> Symbol.all_symbols.size
=> 3119
>> def abc; end
=> :abc
>> Symbol.all_symbols.size
=> 3119
我的问题有两个方面:
我没有读过这本书,但前两句话似乎指的是你问的同样的问题: 符号表就是这样:一个符号表。它不是一个对象表 换句话说-符号可以是标识符的名称,但它们不是标识符,也没有与标识符直接(无上下文)的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内部使用哈希表示所有内容
- 所有类都有一个散列
- 对于每个类,都有一个包含所有方法的哈希
- 对于每个实例,都有一个包含所有实例变量的哈希
- 对于每个方法激活,都有一个包含所有局部变量的哈希
- 等等
:abc
只有一个实例,Ruby使用一个散列,另一个散列-所谓的符号表-将所有符号映射到一个内部幻数。然后这些神奇的数字在内部被用来表示符号。我想这就是为什么这本书的作者写了“符号表不是对象表。”
将字符串“abc”
映射到这些内部数字被称为“插入”,因此符号有时被称为插入字符串
有趣的是,你可以自己用:symbol.object\u id
查找这些神奇的数字,甚至可以根据数字的顺序推断哪些符号是最先创建的
希望这能回答您的问题:)您也不止一次使用数字。您可以将
1
赋值给变量(abc=1
),并将其用作数组索引(ary[1]
),而不会出现任何问题。现在,1
是指变量值还是指数组索引?当然都有,谢谢。这很有道理!