2016-12-14 71 views
-4

我是scala的新手。我曾在java上工作过。使用=运算符在scala中定义函数对我来说没有意义。为什么在定义函数时scala使用=运算符

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

任何人都可以解释一下吗?在上面的代码中,为什么我不得不使用=运算符。

+0

见[这个问题](http://stackoverflow.com/questions/1661817/scala-def-foo-1-vs-def-foo-1)有关使用或不使用=以的区别的详细信息方法声明。 –

回答

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:

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

+0

单位肯定是有人居住。没什么不是。 – HTNW

+0

@HTNW谢谢,我已经改正了答案 – dk14

3

这种方法增强了编程,其中的功能并不比其他的数据类型的不同的功能方面。

例如在斯卡拉

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

在这里,无论是价值numberfunction是不可变的变量。唯一的区别是他们的类型。 numberInt型的,而function(Int, Int) => Int

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

1

还有一个原因,我知道为什么斯卡拉使用=在方法声明为:

返回从方法定义的任何值,=必须使用,否则不能返回任何值,即使在return语句方法。

对于例如:看看下面两段代码:

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

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

method1返回类型始终是单位,即使它返回一些值 而method2回报看重。

+1

最后一句这里是错误的。方法1返回一个单元,方法2返回a.type – Tim

+0

由于配合用于校正.. –

相关问题