Function 在Scala中,我们为什么需要=&引用;在定义方法时?
下面是我们如何定义函数is scala的Function 在Scala中,我们为什么需要=&引用;在定义方法时?,function,scala,functional-programming,Function,Scala,Functional Programming,下面是我们如何定义函数is scala的 def printName() : Any = { println ("vikrant") } def printName() : Unit = { println ("vikrant") } “=”只是一种语法还是有目的?问这个问题是因为当我没有提到返回类型时,我可以跳过这个,如下所示 def printName() { println ("vikrant") } 如果方法返回单元,则可以省略=(称为过程语法),但这是非常不鼓励的(它
def printName() : Any = { println ("vikrant") }
def printName() : Unit = { println ("vikrant") }
“=”只是一种语法还是有目的?问这个问题是因为当我没有提到返回类型时,我可以跳过这个,如下所示
def printName() { println ("vikrant") }
如果方法返回
单元
,则可以省略=
(称为过程语法),但这是非常不鼓励的(它已被弃用,甚至有人讨论过)。发件人:
应根据以下模式声明方法:
过程语法:避免使用过程语法,因为它容易混淆,在简洁性方面几乎没有什么好处
生成的字节码没有区别。只是语法上的糖。见的第4.6.3节,其中说明:
过程存在特殊语法,即返回
单位
值()
。过程声明是省略结果类型的函数声明。
然后,结果类型隐式地完成到
单元
类型
所以它被编译成相同的代码。如果您使用-Xfuture
选项,则此功能具有与之相关的警告:
警告:不推荐使用过程语法。通过添加:Unit=
将过程foo
转换为方法
在Scala中,每个方法都返回一个值(与其他语言不同,其他语言的方法是void
且不返回任何内容)。在其他语言中为void
的方法通常在Scala中返回Unit
(如您的printName
示例)
您可以将任何方法声明为返回
单元
,而不考虑=
后面表达式的值。这是一种称为值丢弃的语言特性,详细解释如下 可能适合功能性风格。Scala似乎在可能的情况下倾向于功能性,而大括号用于创建命令块,它倾向于远离功能性。它的语法与Haskell之类的语言类似,在Haskell中,通常定义函数而不是过程
它的多种书写方式是两种截然不同的范式混合的结果 不同意大括号是必要的。一个简单的例子:
val-xPlus1Squared={val-xPlus1=x+1;xPlus1*xPlus1}
@TooTone-True,如果需要在一个单独的语句函数中绑定变量,则需要使用大括号。即使您的目的是创建一个函数,仍然会有两条语句一条接一条地执行。混合两种不同语言类型的另一个结果。理想情况下,为了实现全功能风格,我们应该使用where
/let
绑定,但不管出于什么原因,它们都没有包括在内。可能是因为这两个语句函数得到了任务doneThanks来回答您的问题。我真正想理解的是,如果我们跳过“=”,我们得到的字节码会有所不同吗?如果不是。。。那么这是一个很好的实践。。。但对许多其他人来说,这也是一个仪式。为了解决这个问题,我增加了一些内容,但没有——这不应该有什么区别。@Vikrant我让编译器抱怨如果我省略等号。即使这对代码的执行没有影响,该语言似乎更喜欢使用等号。@Carcigenicate编译此代码时,是否可以共享警告/错误消息?关于回复,我没有收到任何警告。我正在运行2.11.5。@很遗憾,我不知道它是什么版本。由于平板电脑空间不足,我不得不卸载eclipse。它可能是Scala Eclipse最新版本附带的任何编译器。其要点是“不带=
的函数定义将被弃用,并可能在将来导致错误”(意译)。只有在需要返回值时才需要=
。
def foo(bar: Baz): Bin = expr
// don't do this
def printBar(bar: Baz) {
println(bar)
}
// write this instead
def printBar(bar: Bar): Unit = {
println(bar)
}