这三种定义函数的方法有何不同?

时间:2016-03-05 22:39:47

标签: scala methods anonymous-function

在Scala中,我发现创建函数有三种方法,但当我将它们用作函数时,我几乎找不到它们的行为差异。

scala> def incImplicit(x : Int) = x + 1
incImplicit: (x: Int)Int

scala> def incImplicit(x : Int): Int =  x + 1
incImplicit: (x: Int)Int

scala> def incAnonymous = ((x : Int) => x + 1)
incAnonymous: Int => Int

1 个答案:

答案 0 :(得分:3)

这是一个名为this.context.router.push('/some/path') 的单个参数Int的方法,它返回x(x + 1),其中Int的返回类型由编译器。

Int

这与上面的方法完全相同,只是返回类型是显式的,而不是推断的。

def incImplicit(x: Int) = x + 1

这是一个无参数方法返回一个def incImplicit(x: Int): Int = x + 1 (这是一个带有Function1[Int, Int]参数的函数,返回{{1} })。

Int

即。长签名看起来像这样:

Int

或者

def incAnonymous = ((x : Int) => x + 1)

从功能上讲,它们几乎相同。如果需要def incAnonymous: Function1[Int, Int] = ((x : Int) => x + 1) 作为参数,例如def incAnonymous: Int => Int = ((x : Int) => x + 1) ,则它们都可以正常运行。调用Int => Int时,前两个(无论如何都是相同的方法)将通过 eta-expansion 隐式转换为函数。 def map(f: Int => Int)已经拥有正确的签名,并且不需要转换。

map(incImplicit)map(incAnonymous)将始终为任何incImplicit(x)返回相同的结果。唯一的区别是incAnonymous(x)是一个方法调用,x是一个返回函数的方法调用,然后返回函数的incImplicit方法被调用。通常,除非您有充分的理由这样做,否则您将没有返回函数的方法。