在Scala中定义方法时,我发现了这个
def method1: Int => Int = (j: Int) => j // works
def method2: Int => Int = j => j // works
def method3: Int => Int = j: Int => j // error
def method4: Int => Int = {j: Int => j} // works
任何人都可以解释为什么method3不起作用?它有什么含糊之处吗?
答案 0 :(得分:2)
确实有一种可能的解释是这种限制避免了歧义:x: A => B
可以被理解为一个匿名函数,它接受x
类型的参数A
并返回对象{{1} }。或者可以理解为将变量B
“转换”为类型x
。这两个都是有效的程序是非常罕见的,但并非不可能。考虑:
A => B
这实际上是编译和打印:
class Foo(val n: Int)
val Foo = new Foo(0)
val j: Int => Foo = new Foo(_)
def method1: Int => Foo = (j: Int) => Foo
def method2: Int => Foo = j: Int => Foo
println(method1(1).n)
println(method2(1).n)
答案 1 :(得分:0)
Anonymous Functions section of the specification涵盖了所有这些变体。相关部分是
对于单个无类型形式参数,
(x) => e
可以缩写为x => e
。如果是匿名函数(x : T) => e
如果单个类型参数显示为块的结果表达式,则可以缩写为x: T => e
。
在method3
中,函数不是块的结果表达式;在method4
它是。