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

Lux*_*ode 225 ruby symbols

当我说{ :bla => 1, :bloop => 2 },究竟是:做什么的?我在某处读到了它与字符串的相似之处,但不知何故是一个符号.

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

Chr*_*ung 242

:foo是一个名为"foo"的符号.符号具有明显的特征,即任何两个名称相同的符号都是相同的:

"foo".equal? "foo"  # false
:foo.equal? :foo    # true
Run Code Online (Sandbox Code Playgroud)

这使得比较两个符号的速度非常快(因为只涉及指针比较,而不是像比较字符串中的所有字符),而且你不会有相同符号浮动的无数副本.

此外,与字符串不同,符号是不可变的.

  • @ onmyway133因为Ruby的字符串是可变的.实习仅适用于不可变值. (4认同)
  • a)为什么``foo".等于?"foo"`假?b)你能在任何地方引用一个符号,基本上它们就像全局变量一样吗? (3认同)
  • 只是想知道为什么文字字符串不支持字符串实习? (2认同)
  • @ Arc676 1."相等?"在Ruby中进行身份比较.每个字符串文字,如"foo",都会创建一个新的字符串实例.它的工作原理是因为Ruby中的字符串是可变的.2.符号是全局的,但更像是全局常量而不是全局变量,因为符号没有状态.因此,使用符号不是全局变量的反模式. (2认同)
  • @ Arc676`"foo"=="foo"`#=> true (2认同)

the*_*Man 44

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

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

运行它输出:

"foo".equal? "foo" -> false
"foo" == "foo"     -> true
:foo.equal? :foo   -> true
:foo == :foo       -> true
Run Code Online (Sandbox Code Playgroud)

因此,将字符串与字符串比较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)
Run Code Online (Sandbox Code Playgroud)

两种符号测试在速度方面基本相同.经过1,000,000次迭代后,只有0.004733秒的差异,所以我说这是一个可以使用的清洗.


nun*_*nia 31

符号是一种在ruby中表示字符串和名称的方法.

符号和字符串之间的主要区别在于,在ruby会话期间,初始化了同名符号并且只在内存中存在一次.

当您需要使用相同的单词来表示不同的内容时,它们非常有用


shy*_*an1 17

着名的书" 敏捷Web开发与Rails"中有一些引用,这可能有助于理解符号:

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

redirect_to :action => "edit", :id => params[:id]
Run Code Online (Sandbox Code Playgroud)

您可以将符号视为神奇地变成常量的字符串文字.或者,您可以将冒号视为"名为"的东西,因此:id是"名为id的东西".


小智 7

在 ruby​​ 中,每个对象都有一个唯一的对象标识符,如果您puts "hello".object_id在 irb 中写入并按 2 次不同的回车键,您将获得 2 个不同的返回值,但如果您写入:hello.object_id2 次,您将只能获得相同的一个返回值。这应该可以解释差异。