繁体   English   中英

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

[英]why = is optional in def in Scala

以下两个函数定义都可以编译,即使其中一个使用=且另一个不使用。 为什么? 这种行为有优势吗?

定义1

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

定义2

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

def 1是您要使用的。

def 2被称为过程语法(不推荐使用),其实际含义是:

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

所以现在可能正是您想要的(因为它不返回任何内容)。

当您在def中不使用"="时,表示您定义的函数将返回unit。

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

谢谢

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

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

在第二种情况下,简单地抑制了返回值,将返回Int的函数转换为返回Unit的过程。 这样做时,编译器应发出类似于以下内容的警告

warning: a pure expression does nothing in a statement position

这应该让您知道发生了一些麻烦,例如,存在一条语句,该语句通常会导致该块返回一个值(在您的情况下为index; ),但未使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM