以下两个函数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;
}
答案 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;
),但它没有被使用。