所有参数作为默认值的方法与没有参数的方法不同

  • 本文关键字:方法 参数 默认值 scala
  • 更新时间 :
  • 英文 :


为什么调用所有参数都有默认值的方法与在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 后添加括号,这将有几个含义。

  1. a(): Unit
  2. a(_): Int => Unit

你的意思是哪一个?因此,它迫使您添加括号。

在 Scala 中,一个方法可以有零个或多个参数列表,每个参数列表都有零个或多个参数。如果要调用方法,则必须提供匹配的参数列表,其中包含与参数和参数列表匹配的参数。

在您的情况下,您使用一个参数列表

定义了该方法,因此您需要使用一个参数列表调用它。

不应该是同一个电话吗?

不,它们不一样。第一次调用具有零个参数列表,第二次调用具有一个参数列表。那不一样。

在某些情况下,Scala 允许您通过不提供参数列表来调用具有单个空参数列表的方法。这样做的原因很简单:您希望调用Java getters(使用空参数列表定义)与Scala getters(定义时没有参数列表)相同。但是,这通常不起作用。

最新更新