这两个函数声明是否有效不同?
如果没有,为什么他们有不同的toString值?
scala> def f: (Int) => Int = x=> x*x
f: (Int) => Int
scala> def f(x: Int) = x*x
f: (Int)Int
答案 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。