为什么调用所有参数都有默认值的方法与调用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
工作正常。 不应该是同一个电话?
答案 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
之后没有添加括号,则会有多种含义。
a(): Unit
a(_): Int => Unit
答案 3 :(得分:0)
在Scala中,方法可以包含零个或多个参数列表,每个参数列表都包含零个或多个参数。如果要调用方法,则必须提供匹配的参数列表,其中包含参数和参数列表的匹配参数。
在你的情况下,你用一个参数列表定义了方法,你需要用一个参数列表来调用它。
不,他们不一样。第一个调用具有零参数列表,第二个调用具有一个参数列表。那是不同的。不应该是同一个电话?
某些情况下,Scala允许您通过不提供参数列表来调用具有单个空参数列表的方法。这样做的原因很简单:您希望以与Scala getter(没有参数列表定义)相同的方式调用Java getter(使用空参数列表定义)。但是,这通常不会起作用。。