Ruby:使用引号和冒号初始化字符串之间的区别是什么?

Ya.*_*Ya. 4 ruby

什么是使用引号初始化字符串与使用冒号前面的字符串之间的区别?即"bobo"vs:bobo.当你检查它们时它们看起来是一样的但是当你比较它们时,结果的评估结果为false.

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
Run Code Online (Sandbox Code Playgroud)

Aru*_*hit 8

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

:bobo.class # => Symbol
"bobo".class # => String
Run Code Online (Sandbox Code Playgroud)

String#==

如果obj不是String,则返回false.否则,如果str <=> obj返回零,则返回true.

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

puts :bobo 
# >> bobo
:bobo.to_s # => "bobo"
Run Code Online (Sandbox Code Playgroud)

这是因为puts应用to_s了Symbol对象:bobo.看到Symbol#to_s


Pie*_*ois 5

请注意以下事项:

"foo".object_id
 => 70353007334300
"foo".object_id
 => 70353007354360
:foo.object_id
 => 413928
:foo.object_id
 => 413928
Run Code Online (Sandbox Code Playgroud)

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