Ruby中的冒号操作符是什么?

当我说{ :bla => 1, :bloop => 2 } ,究竟是: do? 我读了一些关于它如何类似于一个string,但不知何故的符号。

我对这个概念不是很清楚,有人能够启发我吗?

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

 "foo".equal? "foo" # false :foo.equal? :foo # true 

这使得比较两个符号的速度非常快(因为只涉及指针比较,而不是像比较string那样比较所有字符),再加上相同符号的浮点数不会超过1亿个。

而且,与string不同,符号是不可变的。

只是为了演示答案中提到的一些事情:

 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 

那么,比较一个string与一个string使用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) 

这两个符号testing的速度基本相同。 经过1,000,000次迭代后,差异只有0.004733秒,所以我认为这是一个使用之间的清洗。

符号是一种在ruby中表示string和名字的方法。

符号和string之间的主要区别在于,在ruby会话期间,同名的符号被初始化并且仅存在于内存中一次。

当你需要使用同一个词代表不同的东西时,它们很有用

有一些着名的书Agile Web Development with Rails中的一些引用,这对于理解符号也是有帮助的:

Rails使用符号来标识事物。 特别是,当命名方法参数和在哈希中查找时,它将它们用作键。

 redirect_to :action => "edit", :id => params[:id] 

您可以将符号想象为string文字,它们被奇迹般地变成常量。 或者,你可以认为冒号意思是“命名的事物”,所以:id是“命名为id的东西”。

在ruby中,每个对象都有一个唯一的对象标识符,如果你在你的irb中puts "hello".object_id ,并且返回2个不同的时间,你将得到2个不同的返回值,但是如果你写了:hello.object_id 2次,只获得相同的返回值。 这应该解释了这个区别。

如果你使用:foo => bar ,foo将会是一个符号。 符号的好处是它们是独一无二的。 当你在哈希中调用一个项目时,你做了hash[:foo]

符号需要比string更less的内存,这也使得它们有用,如果你想让你的程序更快一点。

这是一个象征。 基本上,你说的哈希的两个元素有键和bloop ,就好像你使用了string"bloop""bloop" 。 但是,它们比string占用更less的内存,并且更易于input。

如果您熟悉Java,则可能会意识到Java中的string是不可变的。 Ruby中的符号与此类似。 它们是不可改变的,即任何特定符号的发生次数:symbol将只映射到单个存储器地址。 而且,因此,build议尽可能使用符号,因为它优化了内存使用情况。