尽管我读过"Understanding Ruby Symbols",但当涉及到使用符号时,我仍然对内存中数据的表示感到困惑。如果一个符号,其中两个包含在不同的对象中,存在于相同的内存位置,那么它们为什么包含不同的值呢?我原本期望相同的内存位置包含相同的值。
这是链接中的引用:
与字符串不同,具有相同名称的符号在
会话期间仅在内存中存在一次
我不明白它是如何区分相同内存位置中包含的值的。
考虑这个例子:
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"
暂时忘记哈希,我认为符号就是指向某个值的指针。我的问题是:
发布于 2010-02-26 21:35:11
请考虑以下内容:
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。字符串是可变的。
(回应下面的评论)
在最初的文章中,值不是存储在符号中,而是存储在散列中。请考虑以下内容:
hash1 = { "string" => "value"}
hash2 = { "string" => "value"}
这将在内存中创建6个对象-- 4个string对象和2个hash对象。
hash1 = { :symbol => "value"}
hash2 = { :symbol => "value"}
这只在内存中创建了五个对象--一个符号、两个字符串和两个散列对象。
发布于 2010-02-26 22:40:09
当我这样想的时候,我就能找到符号了。Ruby字符串是一个具有一组方法和属性的对象。人们喜欢将字符串用于键,当字符串用于键时,所有这些额外的方法都不会使用。所以他们制作了symbols,这是字符串对象,删除了所有的功能,除了它是一个好的键所需的功能。
只需将符号视为常量字符串即可。
发布于 2010-02-26 22:37:33
符号:ruby
不包含"red"
或"programming"
。符号:ruby
就是符号:ruby
。正是您的散列、patient1
和patient2
分别包含这些值,在每种情况下都由相同的键指向。
这样想:如果你在圣诞节早上走进起居室,看到两个盒子,上面有一个标签,上面写着"Kezzer“。一只里面有袜子,另一只有煤。您不会感到困惑,并询问"Kezzer“如何同时包含袜子和煤炭,即使它是相同的名称。因为名字中没有包含(糟糕的)礼物。它只是指着他们。类似地,:ruby
不包含散列中的值,它只是指向它们。
https://stackoverflow.com/questions/2341837
复制相似问题