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

Ruby 字符串和符号的不同行为?,ruby,Ruby,我最近在学习ruby,我注意到了一件关于符号和字符串对象的事情。当我给两个不同的变量分配相同的符号时,我发现对象的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 现在看到这一点

我最近在学习ruby,我注意到了一件关于符号和字符串对象的事情。当我给两个不同的变量分配相同的符号时,我发现对象的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 

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

您可以将符号视为自引用的内部字符串-也就是说,给定符号的唯一副本将永远存在。对于某些对象(如Fixnum实例、布尔值或nil)也是如此。它们不被垃圾收集,不可复制,也不可变


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

您可以将符号视为自引用的内部字符串-也就是说,给定符号的唯一副本将永远存在。对于某些对象(如Fixnum实例、布尔值或nil)也是如此。它们不被垃圾收集,不可复制,也不可变


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

看看这个-Ruby将重用符号,而不是字符串。符号就是这样设计的。学习看看这个-Ruby将重用符号,而不是字符串。符号就是这样设计的。学习