什么是使用引号初始化字符串与使用冒号前面的字符串之间的区别?即"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)
"bobo"是一个字符串,而:bobo是一个符号.
:bobo.class # => Symbol
"bobo".class # => String
Run Code Online (Sandbox Code Playgroud)
如果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
请注意以下事项:
"foo".object_id
=> 70353007334300
"foo".object_id
=> 70353007354360
:foo.object_id
=> 413928
:foo.object_id
=> 413928
Run Code Online (Sandbox Code Playgroud)
符号被缓存(相同object_id),而字符串每次都被实例化.请记住这一点以获得性能知识,同时牢记垃圾收集器;)