4

使用引号初始化字符串与在其前面使用冒号初始化字符串有什么区别?即“bobo”与:bobo。当您检查它们时,它们看起来相同,但是当您比较它们时,结果评估为假。

irb(main):006:0> r = "bobo"
=> "bobo"
irb(main):007:0> puts r
bobo
=> nil
irb(main):008:0> t = :bobo
=> :bobo
irb(main):009:0> puts t
bobo
=> nil
irb(main):010:0> puts r == t
false
=> nil
irb(main):011:0> s = "bobo"
=> "bobo"
irb(main):012:0> puts r == s
true
=> nil
4

5 回答 5

9

"bobo"是一个字符串,而:bobo是一个符号。

:bobo.class # => Symbol
"bobo".class # => String

String#==

如果 obj 不是字符串,则返回 false。否则,如果 str <=> obj 返回零,则返回 true。

所以根据文档"bobo" == :bobo # => false"bobo" == "bobo" # => true. - 这是预期的。

puts :bobo 
# >> bobo
:bobo.to_s # => "bobo"

这是因为puts应用to_s在 Symbol 对象上:bobo。看Symbol#to_s

于 2013-07-01T04:39:04.370 回答
5

请注意以下事项:

"foo".object_id
 => 70353007334300
"foo".object_id
 => 70353007354360
:foo.object_id
 => 413928
:foo.object_id
 => 413928

符号被缓存(相同object_id),而字符串每次都被实例化。记住这一点以获得性能知识,但也要记住垃圾收集器;)

于 2013-07-01T07:12:14.547 回答
4

以冒号开头的类似String的东西是Symbol

:bobo.class
# => Symbol
"bobo".class
# => String

当你inspect他们时,他们看起来不同:

:bobo.inspect
# => ":bobo"
"bobo".inspect
# => "\"bobo\""

当你用它们打印它们时,puts它们看起来是一样的,因为puts调用to_s它的参数,并:bobo.to_s返回"bobo"

:bobo.to_s
# => "bobo"
:bobo.to_s == "bobo"
# => true

如果您想更好地了解差异以及符号的使用方式,那么仔细阅读上面链接的文档是一个不错的起点,就像任何 Ruby 教程一样。这篇文章也值得一读:Ruby Symbols and Strings之间的区别

于 2013-07-01T04:46:22.633 回答
3

正如您所说,“带冒号的字符串”是一个符号。虽然它们类似于字符串,但符号是不可变的。可变对象可以在赋值后更改。不可变对象(:symbols) 在赋值后不能改变。它们只能被覆盖。Ruby 是独一无二的,并且是一种动态语言,事情可以而且经常在运行时发生变化。符号更加严格,不会在运行时意外更改。

于 2013-07-01T04:40:31.293 回答
2

符号和字符串之间的主要区别是内存分配和可变性。字符串可以随时更改。

'prasad' << 'surase' => "prasadsurase" 
:prasad << 'surase'
NoMethodError: undefined method `<<' for :prasad:Symbol

同样,具有相同值的两个字符串(例如“prasad”和“prasad”)具有两个不同的内存位置并具有不同的对象 ID。

'prasad'.object_id => 102809450 
'prasad'.object_id => 102894570 
'prasad'.object_id => 103057580 

而两个相同的符号是相同的并且具有相同的内存位置,因为只有一个对象。

:prasad.object_id => 2358408 
:prasad.object_id => 2358408 
:prasad.object_id => 2358408 

此外,当创建字符串时,它需要在不被引用时分配内存 n,它需要被垃圾收集,但符号在整个程序操作期间都保留在内存中,并且在不被引用时不会被垃圾收集。这会影响程序的性能。您可以将所有声明的符号收集为

Symbol.all_symbols.include?(:prasad) => true
于 2013-07-01T11:41:16.123 回答