gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:07:32 25 4
gpt4 key购买 nike

在“Well grounded Rubyist 2nd Edition”中,David Black 指出(第 239 页):

The symbol table is just that: a symbol table. It’s not an object table. If you use an identifier for more than one purpose—say, as a local variable and also as a method name— the corresponding symbol will still only appear once in the symbol table

然后作者继续给出了下面的例子:

>> Symbol.all_symbols.size
=> 3118
>> abc = 1
=> 1
>> Symbol.all_symbols.size
=> 3119
>> def abc; end
=> :abc
>> Symbol.all_symbols.size
=> 3119

我的问题有两个方面:

  1. 同一个标识符怎么可能用于多个目的!? - 我知道 Ruby 根据上下文知道哪个是哪个,但这就足够了吗?
  2. 在上面的例子中创建的符号,它指的是哪个标识符?局部变量还是方法名?

最佳答案

好问题。

让我们一一解开。

  • "How is it possible to have the same identifier for more than one purpose!?"
  • "The symbol that was created, which identifier does it refer to?"

让我先从看起来更熟悉的代码开始。

显然我们可以使用相同的字符串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 使用一个散列,又一个散列——所谓的符号表——将所有符号映射到一个内部魔数(Magic Number)。然后在内部使用这些魔数(Magic Number)来指代该符号。我想这就是本书作者写“符号表不是对象表”的原因。

将字符串 "abc" 映射到这些内部数字称为“interning”,因此符号有时也称为 interned strings。

有趣的是,您可以使用 :symbol.object_id 自己查找这些魔数(Magic Number),甚至可以根据数字的顺序推断出哪些符号最先创建。

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

关于ruby - Ruby 中的单个符号到多个标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41564168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com