在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
答案 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
方法被调用。通常,除非您有充分的理由这样做,否则您将没有返回函数的方法。