3

如果我省略分号,则此代码无法编译。

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

我的猜测是,没有分号,scalac 认为偏函数是该\\*方法的另一个参数,而不是返回值。(它实际上不是一个偏函数,顺便说一下,它是一个全函数。)

我可以在这里没有分号吗?在 Scala 中,我从来没有在行尾使用分号。

4

3 回答 3

2

Just add a second newline, which apparently is equivalent to the semicolon.

Still, I'm not entirely happy with this, as it seems fragile.

于 2013-07-25T10:01:36.730 回答
2

我会这样写:

def checkRadioButton(xml: DslBuilder): String => XmlTree = {
    val inputs = top(xml).\\*(hasLocalNameX("input"));
    (buttonValue: String) => { // <-- changed position of {
      // code omitted
    }
}
于 2013-07-25T11:53:33.350 回答
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。 这是nl带有大括号的 arg 语法中的一点点。

换行处理在规范的 1.2 中描述;nl在本节末尾提到了一些像这样的地方,其中接受单曲。

(两个换行符不起作用,这就是为什么这也可以解决您的问题。)

请注意,nl在括号前面不接受 a ,因此以下工作(尽管只有括号,您的函数文字只能得到一个表达式):

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

这种好语法的原因是你的方法体已经是一个块表达式,当一个块的结果表达式是一个函数字面量时,你可以简化。

的类型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
于 2013-08-10T06:40:29.470 回答