我是否需要使用尾随分号来消除此代码的歧义?

时间:2013-07-25 09:18:29

标签: scala

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

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

我的猜测是,如果没有分号,scalac认为partial函数是\\*方法的另一个参数,而不是返回值。 (顺便说一下,它实际上不是一个部分功能,它是一个完整的功能。)

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

3 个答案:

答案 0 :(得分:2)

只需添加第二个换行符,显然等同于分号。

尽管如此,我对此并不十分满意,因为它似乎很脆弱。

答案 1 :(得分:2)

我会这样写:

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

答案 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

(两个换行不起作用,这也是解决问题的原因。)

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

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