为什么=在Scala中的def是可选的

时间:2017-09-20 08:15:46

标签: scala

以下两个函数definations都编译,即使一个使用=而其他函数没有。为什么?这种行为有优势吗?

def 1

def doWork(index:Int) = {
        sleep((math.random*1000).toLong);
        index;
    }

def 2

def doWork(index:Int) {
        sleep((math.random*1000).toLong);
        index;
    }

3 个答案:

答案 0 :(得分:2)

def 1是你想要使用的。

def 2称为过程语法(不鼓励),实际上意味着:

def doWork(index:Int): Unit = {
    sleep((math.random*1000).toLong)
    index
}

所以它现在可能是你想要的(因为它不会返回任何东西)。

答案 1 :(得分:1)

如果不对networkx使用def,则表示您定义的函数将返回单位。

在第二个函数中,你不使用"=",这意味着定义的函数将返回单位,但你的函数正在返回索引。 这就是为什么它会抛出警告,因为它期望单位并丢弃该值。

由于

答案 2 :(得分:1)

不包括=符号声明procedure。程序返回Unit,即根本不返回任何值。如Scala语言规范(来自上面的链接)中所述:

  

过程定义是一个函数定义,其中省略了结果类型和等号;它的定义表达式必须是一个块。例如,def f(ps) {stats}相当于def f(ps): Unit = {stats}

在第二种情况下,返回值只会被抑制,以将返回Int的函数转换为返回Unit的过程。执行此操作时,编译器应发出类似于

的警告
warning: a pure expression does nothing in a statement position

这应该让你知道有些东西正在发生,也就是说,有一个语句通常会导致块返回一个值(在你的情况下为index;),但它没有被使用。