为什么scala在定义函数时使用=运算符

irf*_*han -4 scala

我是斯卡拉的新手.我一直在研究java.使用=运算符在scala中定义函数对我来说没有意义.

def abc(a:Int,b:Int):Int = 
    a+b
Run Code Online (Sandbox Code Playgroud)

谁能解释一下?在上面的代码中,为什么我必须使用=运算符.

dk1*_*k14 6

我相信有很多原因.其中一些:

1)统一访问:

val abc: Int = 5 //value
def abc: Int = 5 //factory
Run Code Online (Sandbox Code Playgroud)

请注意,这def abc可以通过val abc内部后继实现:

trait Interface {
  def abc: Int //factory (reader)
}

object Implementation extends Interface {
  val abc: Int = 5 //singleton
}
Run Code Online (Sandbox Code Playgroud)

一些高级示例:为什么在Scala中用`def`覆盖`var`是不可能的?

2)函数名为lambda:

val abc = (a: Int, b: Int) => a + b //lambda assigned to abc value
def abc (a:Int, b:Int): Int = a + b //abc method, that could be converted to lambda/function with eta-expansion: "abc _"
Run Code Online (Sandbox Code Playgroud)

第一个和第二个之间的句法差异只是括号的位置,所以它们非常相似.

3)该函数实际返回值,您可能会认为该a + b块独立于函数定义,因此:

def abc ...: Int = {
   val z = a + b
   z
}
Run Code Online (Sandbox Code Playgroud)

几乎就像

val abc: Int = {
  val z = a + b
  z
}
Run Code Online (Sandbox Code Playgroud)

但是a并且b未知,所以我们也需要描述它们:

def abc(a: Int, b: Int): Int = {
  val z = a + b
  z
}
Run Code Online (Sandbox Code Playgroud)

否则,如果您的方法没有返回任何内容,则可以省略=sign:

def abc(a: Int, b: Int) {
  println(a + b)
}
Run Code Online (Sandbox Code Playgroud)

这相当于:

def abc(a: Int, b: Int): Unit = {
  println(a + b)
}
Run Code Online (Sandbox Code Playgroud)

其中Unit(只有一个可能值的居住类型,因此它不包含任何信息)粗略意味着没有返回任何值.

另请参阅官方文档语言规范