如果我省略分号,则此代码无法编译。
def checkRadioButton(xml: DslBuilder): String => XmlTree = {
val inputs = top(xml).\\*(hasLocalNameX("input"));
{ (buttonValue: String) =>
// code omitted
}
}
我的猜测是,如果没有分号,scalac认为partial函数是\\*
方法的另一个参数,而不是返回值。 (顺便说一下,它实际上不是一个部分功能,它是一个完整的功能。)
我可以在这里没有分号吗?在Scala之前,我从来没有在一行末尾使用分号。
答案 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