2011-10-25 20 views
3

假設我們有3個功能:倍,加號和減號。他們做他們的名字所暗示的。然後,我們在JavaScript創建以下行:CoffeeScript如何確定函數參數優先級?

times(plus(1,2) ,minus(5,2)); 

當寫成的CoffeeScript,它是:

times plus 1,2 , minus 5,2 

並編譯成JavaScript後,就變成:

(function() { 
    times(plus(1, 2, minus(5, 2))); 
}).call(this); 

這是不是有什麼我們想要。有沒有CoffeeScript的方法來解決這個問題,或者我們必須使用括號?謝謝,

+6

談到作爲一個數學家,這也正是爲什麼括號首先被髮明。 – Blazemonger

+3

不要窩括號的函數調用,以往,在Ruby或者CoffeeScript的,或任何其他語言,使他們。事實上那些甚至允許省略括號除了在嵌套函數的最隨時隨地調用,而不是一個語法錯誤百靈是一個可怕的不良特性。 – millimoose

+0

@Xi你**可以**使用括號。請,請,請執行。這不是因爲你使用的是CoffeeScript,你必須不惜一切代價避免括號...... – brandizzi

回答

9

正如我在my book解釋,有沒有辦法讓編譯器知道你要使用隱式括號什麼規則。當然,在案件

times plus 1,2, minus 5,2 

很明顯的是,你會想要一個人就意味着

times(plus(1,2), minus(5,2)) 

但是,你可能也寫

times 5, plus 1, parseInt str, 10 

,並期望它被理解(原樣)

times(5, plus(1, parseInt(str, 10)) 

Th CoffeeScript隱式圓括號的規則非常簡單:它們到達表達式的末尾。因此,例如,您可以在數學表達式前面始終粘貼Math.floor

作爲文體問題,我一般只省略括號某一行上的第一個函數調用,從而避免任何可能的混淆。這意味着我會寫你的例子爲

times plus(1,2), minus(5,2) 

不錯,對不對?

+0

+1「我通常只在一行中省略第一個函數調用的parens,從而避免任何潛在的混淆。」 – KFL

+0

我希望CoffeeLint可以在參數解釋含糊不清時提出警告。 – KFL

5

作爲一種替代「常規」函數調用的括號,你可以用括號少樣式功能調用只爲優先括號,如:

times (plus 1, 2), (minus 5, 2) 

中當然,這只是一個品味問題; times plus(1, 2), minus(5, 2)版本也適用。