Scala函数定义和用法

mar*_*oss 1 lambda scala

基于以下定义函数的示例,在不同场景中2和3的最佳用途是什么?

  1. def sum(x: Int, y: Int): Int = { x+y } 这是一个带有参数,返回类型和函数体的函数定义

  2. val sum = (x: Int, y: Int) => { x+y } 这似乎是一个lambda函数赋值给变量,为什么返回类型永远不会在这里定义?

  3. val sum: (Int, Int) => Int = (x,y) => { x+y } 这是将函数定义为一种类型? 我不明白这是怎么回事!

调用时所有3个函数将产生相同的结果:

scala> sum(1,2) Int = 3

Jör*_*tag 5

  1. def sum(x: Int, y: Int): Int = { x+y } 这是一个带有参数,返回类型和函数体的函数定义

不是函数定义.这是一个方法定义.功能和方法根本不同.函数是对象,方法不是.(方法属于对象.)方法可以是多态的,函数不能.

  1. val sum = (x: Int, y: Int) => { x+y } 这似乎是一个lambda函数赋值给变量,为什么返回类型永远不会在这里定义?

您是在问为什么sum未声明类型或为什么未声明函数文字的返回类型?函数文字的返回类型未声明,因为语法中没有办法这样做.您根本无法声明函数文字的返回类型,它始终是推断的.sum未声明类型,因为它没有必要:可以推断它与函数文字的类型相同,即Function2[Int, Int, Int].

想一想val foo = "Hello".

  1. val sum: (Int, Int) => Int = (x,y) => { x+y } 这是将函数定义为一种类型?

不.这与2.完全相同,除了这里sum显式声明的类型(因为(Int, Int) => Int它是语法糖Function[Int, Int, Int])而不是推断.由于类型sum已知,因此可以省略函数参数的类型,因为它们可以从上下文中推断出来.

想一想val foo: String = "Hello".