2013-07-25 27 views
3

如果我省略分號,則此代碼不會編譯。我是否需要一個尾隨分號來消除此代碼的歧義?

def checkRadioButton(xml: DslBuilder): String => XmlTree = { 
    val inputs = top(xml).\\*(hasLocalNameX("input")); 
    { (buttonValue: String) => 
     // code omitted 
    } 
} 

我的猜測是,如果沒有分號,scalac認爲,部分功能是另一種說法爲\\*方法,而不是返回值。 (它實際上不是一個局部的功能,順便說一句,這是一個總的功能。)

我可以不用這裏的分號?在Scala之前,我從來沒有必要在行尾使用分號。

+2

什麼是編譯錯誤?只是出於好奇:方法是否帶有第二個或隱含的參數? –

+1

您是否嘗試過使用本地{...}來分隔'val'行和該塊? – Beryllium

+0

編譯錯誤是'scales.xml.XPath [列表[scales.utils.Path [scales.xml.XmlItem,scales.xml.Elem,[T] scales.utils.ImmutableArrayProxy [T]]]]不帶參數',並且不,它不需要任何第二個或隱含的參數。有一些重名的方法具有相同的名稱,但它們都不是。 –

回答

2

我會寫這樣的而不是:

def checkRadioButton(xml: DslBuilder): String => XmlTree = { 
    val inputs = top(xml).\\*(hasLocalNameX("input")); 
    (buttonValue: String) => { // <-- changed position of { 
     // code omitted 
    } 
} 
+0

這可以更簡單,請參閱我的答案。你可以把大括號發回零件箱,並幫助保持瑞士甜。 –

2

只需添加一個第二換行,這顯然是等價的分號。

不過,我不是這個完全滿意,因爲它似乎脆弱。

2

這裏是一個簡化的解釋和美化。

簡體,

scala> def f: String => String = { 
    | val i = 7 
    | { (x: String) => 
    | "y" 
    | } 
    | } 
<console>:9: error: Int(7) does not take parameters 
     { (x: String) => 
    ^
<console>:12: error: type mismatch; 
found : Unit 
required: String => String 
     } 
    ^

因爲7之後的換行符未作爲一個分號,對於原因,它可能是一個功能應用此失敗;你可能需要一個支撐位於下一行的DSL。 Here is the little nl in the syntax of an arg with braces.

換行處理的規範的1.2中描述;在本節的最後部分提到了幾個像這樣的點,其中接受一個nl

(兩個新行不行,這就是爲什麼還修復你的問題。)

注意到一個nl不是在括號前面所接受,所以下面的工作(雖然只的括號,你只得到一個表達你的函數文本):

scala> def g: String => String = { 
    | val i = 7 
    | ((x: String) => 
    | "y" 
    |) 
    | } 
g: String => String 

其實,對這個問題的代碼最好的編輯是不是更括號但數量較少:

scala> def f: String => String = { 
    | val i = 7 
    | x: String => 
    | "y" 
    | } 
f: String => String 

The reason for this nice syntax是你的方法體已經是一個塊表達式,並且當一個塊的結果表達式是一個函數文本時,你可以簡化。

類型的x也是多餘的。

scala> def f: String => String = { 
    | val i = 7 
    | x => 
    | val a = "a" 
    | val b = "b" 
    | a + i + x + b 
    | } 
f: String => String 

毫不奇怪:

scala> def f: (String, Int) => String = { 
    | val i = 7 
    | (x, j) => 
    | x + (i + j) 
    | } 
f: (String, Int) => String 

scala> f("bob",70) 
res0: String = bob77