为什么调用所有参数都有默认值的方法与在scala中调用没有参数的方法不同?
例:
scala> def a(a:Int=1)=print(a)
a: (a: Int)Unit
scala> def b=print(1)
b: Unit
scala> a
<console>:13: error: missing argument list for method a
Unapplied methods are only converted to functions when a function type
is expected.
You can make this conversion explicit by writing `a _` or `a(_)`
instead of `a`.
a
^
scala> b
1
然而
scala>a()
1
工作正常。不应该是同一个电话吗?
Scala 启用 Arity-0(a) 方法省略括号。
https://docs.scala-lang.org/style/method-invocation.html#arity-0
我可以想到至少一个不需要写括号引起的问题。请考虑以下事项:
val xs = List(1, 2, 3, 4)
def myFunc(x: Int = 42) = 2 * x
val ys = xs.map(myFunc)
在我的示例中发生了 Eta 扩展,方法被提升为函数。但是,如果可以以这种方式使用默认参数调用函数,那么至少在这种情况下语法将是模棱两可的。(我知道这里的调用会导致映射函数的参数类型错误,所以理论上可以在这里解决这种歧义,但这意味着该类型的表达式会对语法解释产生影响,这是在我所知道的任何语言的类型检查之前处理的)
如果你不在 a
后添加括号,这将有几个含义。
-
a(): Unit
-
a(_): Int => Unit
你的意思是哪一个?因此,它迫使您添加括号。
在 Scala 中,一个方法可以有零个或多个参数列表,每个参数列表都有零个或多个参数。如果要调用方法,则必须提供匹配的参数列表,其中包含与参数和参数列表匹配的参数。
在您的情况下,您使用一个参数列表定义了该方法,因此您需要使用一个参数列表调用它。
不应该是同一个电话吗?
不,它们不一样。第一次调用具有零个参数列表,第二次调用具有一个参数列表。那不一样。
在某些情况下,Scala 允许您通过不提供参数列表来调用具有单个空参数列表的方法。这样做的原因很简单:您希望调用Java getters(使用空参数列表定义)与Scala getters(定义时没有参数列表)相同。但是,这通常不起作用。