带引号的:"foo"
和:'foo'
符号是符号文字,还是:
字符串上的一元运算符?
答案 0 :(得分:3)
:
实际上只是您自己输入或通过方法创建的文字的一部分。虽然:
可以使用名称或"string"
来创建文字,但与操作符不同,它不会引发任何操作或修改值。
在每种情况下都返回一个Symbol实例。用字符串表示法编写:
有时很重要。例如,如果要表示包含空格作为符号的字符串,则需要使用字符串表示法。
> :foo
=> :foo
> :foo bar
SyntaxError: (irb):2: syntax error, unexpected tIDENTIFIER, expecting end-of-input
> :"foo bar"
=> :"foo bar"
此外,使用等于运算符(==)
> :"foo" == :foo
=> true
> :"foo " == :foo
=> false
我的建议是,不要将它视为传递字符串或名称来创建符号,而是用不同的方式表达相同的符号。最后,您输入的内容将被解释为一个对象。这可以通过不同的方式实现。
> :"foo"
=> :foo
毕竟,%w(foo bar)
也是另一种撰写['foo', 'bar']
的方法。
答案 1 :(得分:1)
Ruby's documentation on Symbol literals说:
您可以使用冒号引用符号:
:my_symbol
。您也可以通过插值创建符号:
:"my_symbol1" :"my_symbol#{1 + 1}"
基本上:"foo"
和:'foo'
是符号文字,但是当您想使用插值创建符号时它们非常有用。
答案 2 :(得分:-1)
如果您的符号有空格,您还需要引号:
hash = {
:"a b c" => 10,
:"x y z" => 20,
}
puts hash[:"a b c"]
--output:--
10
所以第一个。来自文档:
[Symbols]使用:name和:“name”文字语法生成,并使用 各种to_sym方法。