为了账号安全,请及时绑定邮箱和手机立即绑定

Ruby中的冒号运算符是什么?

/ 猿问

Ruby中的冒号运算符是什么?

达令说 2019-10-15 10:50:37

当我说时{ :bla => 1, :bloop => 2 },该:怎么办?我在某处读到了它与字符串的相似之处,但在某种程度上却是一个符号。

我对这个概念不太清楚,有人可以启发我吗?


查看完整描述

3 回答

?
一只甜甜圈

:foo是一个名为“ foo”的符号。符号具有明显的特征,即任何两个相同的符号将是相同的:


"foo".equal? "foo"  # false

:foo.equal? :foo    # true

这使得比较两个符号的速度非常快(因为只涉及指针比较,而不是像字符串中那样比较所有字符),而且您不会在同一符号周围成千上万个副本。


另外,与字符串不同,符号是不可变的。


查看完整回答
反对 2019-10-15
?
沧海一幻觉

只是为了演示答案中提到的一些内容:


require 'benchmark'


n = 1_000_000


print '"foo".equal? "foo" -> ', ("foo".equal? "foo"), "\n"

print '"foo" == "foo"     -> ', ("foo" == "foo"    ), "\n"

print ':foo.equal? :foo   -> ', (:foo.equal? :foo  ), "\n"

print ':foo == :foo       -> ', (:foo == :foo      ), "\n"


Benchmark.bm(10) do |b|

  b.report('string')     { n.times { "foo".equal? "foo" }}

  b.report('str == str') { n.times { "foo" == "foo"     }}

  b.report('symbol')     { n.times { :foo.equal? :foo   }}

  b.report('sym == sym') { n.times { :foo == :foo       }}

end

运行它的输出:


"foo".equal? "foo" -> false

"foo" == "foo"     -> true

:foo.equal? :foo   -> true

:foo == :foo       -> true

因此,使用字符串将字符串与字符串进行比较equal?失败,因为它们是不同的对象,即使它们的内容相同。==比较内容,带符号的等效检查要快得多。


                 user     system      total        real

string       0.370000   0.000000   0.370000 (  0.371700)

str == str   0.330000   0.000000   0.330000 (  0.326368)

symbol       0.170000   0.000000   0.170000 (  0.174641)

sym == sym   0.180000   0.000000   0.180000 (  0.179374)

就速度而言,两个符号测试基本相同。经过1,000,000次迭代后,仅相差0.004733秒,因此我认为这是一次使用。


查看完整回答
反对 2019-10-15
?
天涯尽头无女友

在ruby中,每个对象都有一个唯一的对象标识符,如果您puts "hello".object_id在irb中写入并按两次return键,则将获得2个不同的返回值,但是如果您写入:hello.object_id2次,则将仅获得相同的一个返回值。那应该解释了差异。


查看完整回答
反对 2019-10-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信