Function 在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") } 如果方法返回单元,则可以省略=(称为过程语法),但这是非常不鼓励的(它

下面是我们如何定义函数is scala的

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)
}