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

时间:2016-12-14 06:37:36

标签: scala

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

def abc(a:Int,b:Int):Int = 
    a+b

任何人都可以解释一下吗?在上面的代码中,为什么我必须使用= operator。

3 个答案:

答案 0 :(得分:6)

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

1)uniform access

val abc: Int = 5 //value
def abc: Int = 5 //factory

请注意,此类def abc可以在后续版本中使用val abc实现:

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

object Implementation extends Interface {
  val abc: Int = 5 //singleton
}

一些高级示例:Why it's impossible to override `var` with `def` in Scala?

2)函数名为lambda's:

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 _"

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

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

def abc ...: Int = {
   val z = a + b
   z
}

几乎就像

val abc: Int = {
  val z = a + b
  z
}

ab未知,因此我们也需要对其进行描述:

def abc(a: Int, b: Int): Int = {
  val z = a + b
  z
}

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

def abc(a: Int, b: Int) {
  println(a + b)
}

相当于:

def abc(a: Int, b: Int): Unit = {
  println(a + b)
}

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

另请参阅official doclanguage spec

答案 1 :(得分:3)

这种方法增强了编程的功能方面,其中函数与其他数据类型没有区别。

e.g。在斯卡拉

val number = 10
val function = (a:Int, b:Int) => a + b

这里,值numberfunction都是不可变的变量。唯一的区别是他们的类型。 number的类型为Int,而function的类型为(Int, Int) => Int

这使得函数可以像数据一样处理,并像其他变量一样传递。这增强了像Higher Order Functions这样的概念,它可以接受和返回函数值而不是文字值。正如@ dk14所提到的那样,它是关于统一访问的。

答案 2 :(得分:1)

我知道为什么scala在方法声明中使用=的原因有:

要从方法定义返回任何值,必须使用=或者即使方法中有return语句也无法返回任何值。

对于Eg:请查看以下两个代码段:

def method1()
{
  val a=1
  return a
}

def method2()=
{
  val a=1
  return a
}

method1返回类型总是单位,即使它返回一些值 而method2返回值a。