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

时间:2017-10-18 10:01:36

标签: 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

工作正常。 不应该是同一个电话?

4 个答案:

答案 0 :(得分:1)

Scala 启用 Arity-0 (a)省略括号的方法。

https://docs.scala-lang.org/style/method-invocation.html#arity-0

答案 1 :(得分:1)

我可以想到至少有一个问题是由不需要写括号引起的。请考虑以下事项:

val xs = List(1, 2, 3, 4)
def myFunc(x: Int = 42) = 2 * x
val ys = xs.map(myFunc)

在我的例子中发生了Eta扩展,方法被提升为函数。但是如果可以用这种方式用默认参数调用函数,那么语法至少在这种情况下是不明显的。 (我知道这里的调用会导致错误的参数类型的map函数,所以理论上可以在这里解决这种歧义,但这意味着表达式会对语法解释产生影响,这种解释在类型之前处理 - 检查我知道的任何语言)

答案 2 :(得分:1)

如果您在a之后没有添加括号,则会有多种含义。

  1. a(): Unit
  2. a(_): Int => Unit
  3. 你是说什么意思?因此,它会强制您添加括号。

答案 3 :(得分:0)

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

在你的情况下,你用一个参数列表定义了方法,你需要用一个参数列表来调用它。

  

不应该是同一个电话?

不,他们不一样。第一个调用具有零参数列表,第二个调用具有一个参数列表。那是不同的。

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