使用和不使用" ="之间的区别是什么?在Scala defs?

时间:2014-07-20 04:31:02

标签: scala

以下两个def之间有什么区别

def someFun(x:String) { x.length } 

AND

def someFun(x:String) = { x.length } 

5 个答案:

答案 0 :(得分:7)

正如其他人已经指出的那样,前者是

的句法快捷方式
def someFun(x:String): Unit = { x.length }

意味着x.length的值被丢弃,而函数返回Unit(如果您愿意,则返回())。

我想从2013年10月29日(https://github.com/scala/scala/pull/3076/)强调这已被弃用,但是如果您使用-Xfuture进行编译,则会显示警告标志。

scala -Xfuture -deprecation

scala> def foo {}
<console>:1: warning: Procedure syntax is deprecated. Convert procedure `foo` to method by adding `: Unit =`.
       def foo {}
foo: Unit

所以你永远不应该使用所谓的过程语法。 马丁奥德斯基本人在Scala Day 2013 Keynote中指出了这一点,并在scala mailing list进行了讨论。

语法非常不一致,初学者在学习语言时遇到这个问题很常见。出于这个原因,它很可能会在某些时候从语言中删除。

答案 1 :(得分:6)

如果没有等于它,则隐式输入以返回Unit(或“void”):正文的结果是固定的 - 不是推断的 - 并且任何可能的返回值都将被丢弃。

也就是说,def someFun(x:String) { x.length } 等效def someFun(x:String): Unit = { x.length },这两者都不是很有用,因为该函数不会产生副作用并且不返回任何值。

没有显式Unit(或其他类型)的“equals form”具有推断的返回类型;在这种情况下,def someFun(x:String): Int = { x.length }更有用,虽然不是很令人兴奋。


我更喜欢为所有公开的成员指定返回类型,这有助于确保API /合同的稳定性,并且可以说明了清晰度。对于“无效”方法,这可以通过使用过程形式来完成,没有等于,虽然这是一个更好的风格辩论 - 反对者可能会争辩说,有不同的形式会导致不必要的问题; - )

答案 2 :(得分:3)

前者是

def someFun(x: String): Unit = {
  x.length
  ()  // return unit
}

后者是

def someFun(x: String): Int = {
  x.length  // returned
}

答案 3 :(得分:1)

请注意,Scala Style guide始终建议在

中使用&#39; =&#39;
  

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

def foo(bar: Baz): Bin = expr
  

应使用参数类型,箭头和返回类型之间的空格声明函数类型:

def foo(f: Int => String) = ...
def bar(f: (Boolean, Double) => List[String]) = ...

答案 4 :(得分:0)

根据 Scala-2.10 ,首选使用等号。事实上,除了返回Unit的定义外,你必须使用等号登录调用声明。

因此没有区别,但不推荐使用第一个,不应该使用它。