字符串和符号的不同行为?

时间:2014-07-30 22:18:20

标签: ruby

我最近从koans学习了ruby,我注意到有关符号和字符串对象的一件事。当我分配两个不同的变量相同的符号时,我发现object_id是相同的。

2.1.1 :017 > symbol1 = :a
 => :a 
2.1.1 :018 > symbol2 = :a
 => :a 
2.1.1 :019 > symbol1.object_id
 => 361768 
2.1.1 :020 > symbol2.object_id
 => 361768 

现在看到这个我认为它应该是真正的字符串和整数。但是当我对字符串做同样的事情时,对象id最终变得不同了。

2.1.1 :021 > string1 = "test"
 => "test" 
2.1.1 :022 > string2 = "test"
 => "test" 
2.1.1 :023 > string1.object_id
 => 13977640 
2.1.1 :024 > string2.object_id
 => 13932280 

为什么符号和字符串的行为不同?

1 个答案:

答案 0 :(得分:5)

您可以将符号视为自引用的实习字符串 - 也就是说,只存在给定符号的一个副本。对于Fixnum实例,布尔值或nil等一些对象也是如此。它们不是垃圾收集,不可复制,也不可变。

另一方面,字符串是垃圾收集,可复制,并且是可变的。每次声明字符串时,都会分配一个新对象。