当我说{ :bla => 1, :bloop => 2 }
,究竟是:
做什么的?我在某处读到了它与字符串的相似之处,但不知何故是一个符号.
我对这个概念不是很清楚,有人可以启发我吗?
Chr*_*ung 242
:foo
是一个名为"foo"的符号.符号具有明显的特征,即任何两个名称相同的符号都是相同的:
"foo".equal? "foo" # false
:foo.equal? :foo # true
Run Code Online (Sandbox Code Playgroud)
这使得比较两个符号的速度非常快(因为只涉及指针比较,而不是像比较字符串中的所有字符),而且你不会有相同符号浮动的无数副本.
此外,与字符串不同,符号是不可变的.
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_id
2 次,您将只能获得相同的一个返回值。这应该可以解释差异。