基于以下定义函数的示例,在不同场景中2和3的最佳用途是什么?
def sum(x: Int, y: Int): Int = { x+y }
这是一个带参数,返回类型和函数体的函数定义
val sum = (x: Int, y: Int) => { x+y }
这似乎是一个lambda函数赋值给变量,为什么返回类型永远不会在这里定义?
val sum: (Int, Int) => Int = (x,y) => { x+y }
这是将函数定义为一种类型?
我不明白这是如何运作的!
调用时所有3个函数都会产生相同的结果:
scala> sum(1,2)
Int = 3
答案 0 :(得分:5)
- 醇>
def sum(x: Int, y: Int): Int = { x+y }
这是一个带参数,返回类型和函数体的函数定义
这是不函数定义。这是方法定义。函数和方法从根本上不同。函数是对象,方法不是。 (方法属于对象。)方法可以是多态的,函数可以是
。
- 醇>
val sum = (x: Int, y: Int) => { x+y }
这似乎是一个lambda函数赋值给变量,为什么返回类型永远不会在这里定义?
您是在问为什么sum
的类型没有被声明,或者为什么函数文字的返回类型没有被声明?函数文字的返回类型未被声明,因为语法中没有办法这样做。您只是不能声明函数文字的返回类型,它总是被推断出来。 sum
的类型未被声明,因为它没有必要:可以推断它与函数文字的类型相同,即Function2[Int, Int, Int]
。
思考val foo = "Hello"
。
- 醇>
val sum: (Int, Int) => Int = (x,y) => { x+y }
这是将函数定义为类型?
没有。这与2.完全相同,只是在这里明确声明了sum
的类型((Int, Int) => Int
,它是Function[Int, Int, Int]
)的语法糖而不是推断。由于sum
的类型是已知的,因此您可以省略函数参数的类型,因为它们可以从上下文中推断出来。
思考val foo: String = "Hello"
。
答案 1 :(得分:0)
在第2行中,scala编译器推断出lambda函数的类型。
val sum = (x: Int, y: Int) => { x + y }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function value
x 和 y 是Int的类型,因此 x + y 是Int类型。在这种情况下, sum 的类型是 (Int,Int)=> INT 强>
在第3行中,它显示了sum的类型 - (Int,Int)=> INT 即可。 sum 表示与第2行相同的功能。
val sum: (Int, Int) => Int = (x,y) => { x+y }
~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~
type function value
= 的右侧是功能签名和正文。它接收两个名为 x 和 y 的参数。它的身体 x + y 。
很快,第2行和第3行是等价的。第2行没有函数值类型,但scala可以推断其类型。第3行显式有函数值类型,省略函数值的签名参数类型。
答案 2 :(得分:0)
这是关于方法和功能之间的区别。显示差异的有用链接是http://java.dzone.com/articles/revealing-scala-magician%E2%80%99s
我认为在第三种方式中,你可以理解它类型为T =(Int,Int)=> Int然后这样做:val sum:T =(x,y)=> {x + y}
另一件事是,如果删除输入参数,方法和功能是不同的。
def sum:Int = {3} // call sum,get 3
val sum :()=> Int =()=> {3} //调用sum,返回一个函数,需要调用sum()来得到3