首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何理解Ruby中的符号

如何理解Ruby中的符号
EN

Stack Overflow用户
提问于 2010-02-26 21:22:05
回答 11查看 42.3K关注 0票数 85

尽管我读过"Understanding Ruby Symbols",但当涉及到使用符号时,我仍然对内存中数据的表示感到困惑。如果一个符号,其中两个包含在不同的对象中,存在于相同的内存位置,那么它们为什么包含不同的值呢?我原本期望相同的内存位置包含相同的值。

这是链接中的引用:

与字符串不同,具有相同名称的符号在

会话期间仅在内存中存在一次

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

考虑这个例子:

代码语言:javascript
复制
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

patient1patient2都是散列,这很好。然而,:ruby是一个符号。如果我们要输出以下内容:

代码语言:javascript
复制
patient1.each_key {|key| puts key.to_s}

那么输出的是什么?"red"还是"programming"

暂时忘记哈希,我认为符号就是指向某个值的指针。我的问题是:

  • 我可以为符号赋值吗?
  • 是一个符号,它只是一个指向变量的指针,其中包含一个值。
  • 如果符号是全局的,这是否意味着符号总是指向一件事?
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-02-26 21:35:11

请考虑以下内容:

代码语言:javascript
复制
x = :sym
y = :sym
(x.__id__ == y.__id__ ) && ( :sym.__id__ == x.__id__) # => true

x = "string"
y = "string"
(x.__id__ == y.__id__ ) || ( "string".__id__ == x.__id__) # => false

因此,无论您如何创建symbol对象,只要它的内容相同,它就会引用内存中的相同对象。这不是问题,因为符号是immutable object。字符串是可变的。

(回应下面的评论)

在最初的文章中,值不是存储在符号中,而是存储在散列中。请考虑以下内容:

代码语言:javascript
复制
hash1 = { "string" => "value"}
hash2 = { "string" => "value"}

这将在内存中创建6个对象-- 4个string对象和2个hash对象。

代码语言:javascript
复制
hash1 = { :symbol => "value"}
hash2 = { :symbol => "value"}

这只在内存中创建了五个对象--一个符号、两个字符串和两个散列对象。

票数 63
EN

Stack Overflow用户

发布于 2010-02-26 22:40:09

当我这样想的时候,我就能找到符号了。Ruby字符串是一个具有一组方法和属性的对象。人们喜欢将字符串用于键,当字符串用于键时,所有这些额外的方法都不会使用。所以他们制作了symbols,这是字符串对象,删除了所有的功能,除了它是一个好的键所需的功能。

只需将符号视为常量字符串即可。

票数 55
EN

Stack Overflow用户

发布于 2010-02-26 22:37:33

符号:ruby不包含"red""programming"。符号:ruby就是符号:ruby。正是您的散列、patient1patient2分别包含这些值,在每种情况下都由相同的键指向。

这样想:如果你在圣诞节早上走进起居室,看到两个盒子,上面有一个标签,上面写着"Kezzer“。一只里面有袜子,另一只有煤。您不会感到困惑,并询问"Kezzer“如何同时包含袜子和煤炭,即使它是相同的名称。因为名字中没有包含(糟糕的)礼物。它只是指着他们。类似地,:ruby不包含散列中的值,它只是指向它们。

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2341837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档