为什么要使用:" string val"声明符号的表示法

时间:2018-02-15 12:10:27

标签: ruby syntax literals

:"String Val"创建一个存储"String Val"的符号。 :"Hello Kitty".class返回Symbol。我想这是创建一个有空格的符号。除了迫使需要符号的方法之外,我无法想到为什么这会有用。

还有其他理由使用它吗?

4 个答案:

答案 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"