2014-10-29 38 views

回答

3

冒号:之前的一个字符*是一个Symbol文字。这适用于:+,这是一个内容为“+”的Symbol

在某些情况下,可以使用符号来引用具有相同名称的方法,并且在一些地方,您的示例:+可以是对+运算符的引用,该运算符实际上只是具有相同名称的方法。 Ruby支持语法来调用它,当它看到一个普通的+在表达式中,或在一些核心方法它会转换:+

您也可以使用:+速记创建一个整数Array的总和的例子:

[1,2,3,4].inject(:+) 
=> 10 

这工作,因为Ruby有特例,即具体使用中Array#inject运营商(在Enumberable#inject实际上定义,Array从该模块得到它)。

一个更普遍的用例像这样的符号是send方法:

2.send(:+, 2) 
=> 4 

虽然2.send("+", 2)作品就好了。如果使用这种方式而不是仅仅使用2 + 2,这看起来可能很奇怪,但如果您想对运算符进行更加动态的选择,它可能非常方便。


*允许的Symbol字面允许或不允许的语法规则是有点神秘。它们可以让你在可能的情况下编写较短的文字,但Ruby必须避免一些模棱两可的语法,例如Symbol,其中.或中间为空白。这是允许的,只要你生成这样一个Symbol例如你必须添加引号。 :"this.that"

+1

作为一个说明'#inject'实际上是一个'Enumerable'方法'Enumberable#inject',而不是那个好的答案。 – engineersmnky 2014-10-29 20:50:17

+0

太好了。谢谢Neil,这真是一个很棒的解释,非常感谢。 – Jinn 2014-10-29 20:55:21

+1

您可能想要限定“特殊”。 ':$ set',':@ name'和':'煎饼屋在哪里?''都是符号,但有些可能会调用这些特殊字符。 – 2014-10-29 21:02:14

2

红宝石会告诉你

:+.class 
# Symbol 

(:+)是括号中的符号。

+3

我的回答有什么不正确? – Max 2014-10-29 21:21:29

+1

+1完全正确,不知道为什么downvote ... – maerics 2014-10-29 22:03:39

相关问题