以两种方式声明函数。有什么区别?

时间:2010-04-27 10:48:43

标签: scala

这两个函数声明是否有效不同?

如果没有,为什么他们有不同的toString值?

scala> def f: (Int) => Int = x=> x*x
f: (Int) => Int

scala> def f(x: Int) = x*x
f: (Int)Int

2 个答案:

答案 0 :(得分:18)

第一种是无参数方法f1,它返回Function1[Int, Int]

scala> def f1: (Int => Int) = (x: Int) => x * x
f1: (Int) => Int

第二个是一个参数方法f2,它采用Int并返回Int

scala> def f2(x: Int): Int = x * x
f2: (x: Int)Int

您可以使用相同的语法调用f1和f2,但是当您致电f1(2)时,它会扩展为f1.apply(2)

scala> f1
res0: (Int) => Int = <function1>

scala> f1(2)
res1: Int = 4

scala> f1.apply(2)
res2: Int = 2

scala> f2(2)
res3: Int = 4

最后,您可以将方法f2“提升”到一个函数,如下所示。

scala> f2
<console>:6: error: missing arguments for method f2 in object $iw;
follow this method with `_' if you want to treat it as a partially applied funct
ion
       f2
       ^

scala> f2 _
res7: (Int) => Int = <function1>

scala> (f2 _).apply(2)
res8: Int = 4

练习f1 _的类型是什么?

答案 1 :(得分:4)

这些是方法声明,而不是函数声明。第一种方法返回一个函数,第二种方法返回Int并且与函数无关。

请参阅this question