尽管读了"Understanding Ruby Symbols",但在使用符号时,我仍然对内存中数据的表示感到困惑.如果一个符号(其中两个包含在不同的对象中)存在于同一个内存位置,那么它们如何包含different个值?我希望相同的内存位置包含相同的值.

这是链接中的一段引用:

与字符串不同,相同名称的符号在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

patient1patient2都是散列,没关系.然而,:ruby是一个符号.如果我们要输出以下内容:

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

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

暂时忘记散列,我认为一个符号是一个pointer比一个值.我的问题是:

  • 我可以给符号赋值吗?
  • 一个符号只是一个指针,指向一个有值的变量吗?
  • 如果符号是全球性的,这是否意味着符号总是指向一件事?

推荐答案

考虑一下:

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

所以,不管你如何创建一个符号对象,只要它的内容是相同的,它就会引用内存中的同一个对象.这不是问题,因为符号是immutable object.字符串是可变的.


(回应以下 comments )

In the original article, the value is not being stored in a symbol, it is being stored in a hash. 考虑一下:

hash1 = { "string" => "value"}
hash2 = { "string" => "value"}

这将在内存中创建六个对象——四个字符串对象和两个哈希对象.

hash1 = { :symbol => "value"}
hash2 = { :symbol => "value"}

这只会在内存中创建五个对象——一个符号、两个字符串和两个哈希对象.

Ruby相关问答推荐

使用正则表达式判断用户输入的开头是否正好有两个大括号

当Ruby `Complex` 类除了`==` 之外没有任何关系运算符时,它的祖先怎么能有`Comparable`?

Ruby 中的yield关键字有什么作用?

each_with_index_do 从 1 开始索引

如何在不将换行符粘贴到字符串中的情况下使用puts添加额外的换行符?

这些 Ruby 命名空间约定之间有什么区别?

拆分 Ruby 字符串时如何保留分隔符?

判断 Ruby Gem 的可用性

用mustache迭代数组

如何在 linux (ubuntu) 上更新 ruby​​?

判断 Ruby HTTP 响应是否成功

Ruby 多维数组

Ruby 设计模式:如何制作可扩展的工厂类?

HAML 中 Javascript 中的 Ruby 方法

工厂女孩 - 目的是什么?

Ruby 将 CSV 文件读取为 UTF-8 和/或将 ASCII-8Bit 编码转换为 UTF-8

运行 Ruby 命令时,PATH 中不安全的世界可写目录 /Users/username,模式 040777

如何在器上下文中运行 ruby​​ 脚本?

如何在 Ruby 中找到字符串中字符的索引?

Ruby中的字符串和符号有什么区别?