:"String Val"
创建一个存储"String Val"
的符号。 :"Hello Kitty".class
返回Symbol
。我想这是创建一个有空格的符号。除了迫使需要符号的方法之外,我无法想到为什么这会有用。
还有其他理由使用它吗?
答案 0 :(得分:3)
重要的原因是利用字符串插值,它允许动态生成符号。
5.times.map{ |x| :"symbol_#{x}" }
=> [:symbol_0, :symbol_1, :symbol_2, :symbol_3, :symbol_4]
答案 1 :(得分:2)
这不仅仅是空间,而是任何被认为应该被解释的胡言乱语。像
:"zoo@-55**12 +foo(3, baz)[7] - ❤️"
引用意味着“按原样使用”。这使得它们作为字符串的文字语法直观,但您可以看到还有其他用途。
但是说“just”需要符号而不是字符串的方法有点误导。尽管Rails试图让你相信,但符号和字符串是非常不同的,应该区别对待。符号通常用作一种神奇的常量,而字符串是常规值。
这就像说我们为什么需要String#to_i
。是否仅适用于以不同方式处理42
和"42"
的方法?
至于为什么有文字语法 - 只是方便(就像任何其他语法糖)。考虑:
{
something_something: 1,
something_completely_different: 2,
'yet something else': 3,
}
如果我们不得不写下来,那将是不幸的:
{
:something_something => 1,
:something_completely_different => 2,
'yet something else'.to_sym => 3,
}
或者
{
something_something: 1,
something_completely_different: 2,
'yet something else'.to_sym => 3,
}
答案 2 :(得分:2)
已经有String#to_sym
。鉴于这一事实,似乎:"..."
是一种语法糖,总是可以被String#to_sym
取代。但事实并非如此。除了方便程序员之外,还必须有一个符号:"..."
,而不管String#to_sym
是否存在,至少是为了检查。在这个例子中,
"foo bar".to_sym
# => :"foo bar"
检查表不能是"foo bar".to_sym
,它表示将方法应用于字符串,因为可以通过许多其他方式获得相同的对象,这只是创建此类对象的一种方法。必须有一种独特的方式来表达这样的符号,即:"foo bar"
。
一旦我们有这样的表达式进行检查,该表达式自然也可以用作符号文字。
答案 3 :(得分:1)
这是另一个用例:
:3
# => syntax error, unexpected tINTEGER, expecting tSTRING_CONTENT or tSTRING_DBEG or tSTRING_DVAR or tSTRING_END
:"3"
# => :"3"