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

vjd*_*ama 0 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 
Run Code Online (Sandbox Code Playgroud)

现在看到这个我认为它应该是真正的字符串和整数.但是当我对字符串做同样的事情时,对象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 
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ald 5

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

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