如何理解Ruby中的符号

尽管阅读了“ 理解Ruby符号 ”,但在使用符号时,我仍然对内存中数据的表示感到困惑。如果一个符号(其中两个包含在不同的对象中)存在于同一个内存位置,那么它们如何包含不同的值?我原本期望相同的内存位置包含相同的值。


这是来自链接的引用:


与字符串不同,同名的符号在ruby会话期间初始化并仅存在于内存中一次


我不明白它如何设法区分同一内存位置中包含的值。


考虑这个例子:


patient1 = { :ruby => "red" }

patient2 = { :ruby => "programming" }


patient1.each_key {|key| puts key.object_id.to_s}

3918094

patient2.each_key {|key| puts key.object_id.to_s}

3918094

patient1并且patient2都是哈希,这很好。  :ruby然而是一个象征。如果我们要输出以下内容:


patient1.each_key {|key| puts key.to_s}

然后将输出什么?"red",还是"programming"?


忘记哈希一秒钟,我认为符号是一个指向值的指针。我的问题是:


我可以为符号分配值吗?

符号只是指向具有值的变量的指针吗?

如果符号是全局的,那是否意味着符号总是指向一个东西?


catspeake
浏览 665回答 3
3回答

冉冉说

当我这样想时,我能够生成符号。Ruby字符串是一个具有大量方法和属性的对象。人们喜欢使用字符串作为键,当字符串用于键时,则不使用所有这些额外的方法。因此,他们制作符号,这些符号是删除了所有功能的字符串对象,除了它是一个好键所需要的。只需将符号视为常量字符串即可。

紫衣仙女

符号:ruby不包含"red"或"programming"。符号:ruby只是符号:ruby。这是你的哈希值,patient1并且patient2每个包含这些值,在每种情况下有相同键指向。想一想:如果你在圣诞节早晨进入起居室,看到两个带有标签的盒子,上面写着“Kezzer”。在它上面有袜子,另一个有煤。你不会感到困惑,并问“Kezzer”如何包含袜子和煤炭,即使它是同一个名字。因为名称不包含(蹩脚)礼物。它只是指着他们。同样,:ruby不包含哈希值中的值,它只是指向它们。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Ruby