2014-10-29 120 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

相關問題