在Scala中我们为什么需要" ="在定义方法时?

时间:2015-04-30 16:19:09

标签: function scala functional-programming

以下是我们如何定义函数是scala

def printName() : Any = { println ("vikrant") } 
def printName() : Unit = { println ("vikrant") } 

" ="只是一个语法或它有一个目的?问这个是因为我没有提到返回类型时允许跳过这个,如下面的

def printName() { println ("vikrant") }     

2 个答案:

答案 0 :(得分:6)

如果方法返回Unit,则可以省略=(称为过程语法),但强烈建议不要这样做(它已被弃用,甚至有与remove it进行了讨论。来自the style guide in the docs

  

应根据以下模式声明方法:

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

生成的字节代码没有区别。它只是语法糖。请参阅the Scala specification的第4.6.3节,其中包含:

  

程序存在特殊语法,即返回的函数   Unit()。过程声明是一个函数声明,其中省略了结果类型。   然后隐式地完成结果类型   Unit类型。

所以它编译成相同的代码。如果您使用-Xfuture选项:

,此功能会发出相关警告
  

警告:不推荐使用过程语法。通过添加foo将方法: Unit =转换为方法。

在Scala中,每个方法都返回一个值(与方法为void并且不返回任何内容的其他语言不同)。其他语言中void的方法通常会在Scala中返回Unit(例如您的printName示例)。

您可以将任何方法声明为返回Unit,无论=之后的表达式的值如何。这是一种称为值丢弃的语言功能,解释更多here

答案 1 :(得分:-2)

可能适合功能风格。 Scala似乎在可能的情况下倾向于功能,并且花括号用于创建命令性块,这可以避开功能。它与Haskell等语言的语法类似,通常用于定义函数而不是过程。

它可以编写的许多方法是混合两种截然不同的范例的结果。