以下两个def
之间有什么区别
def someFun(x:String) { x.length }
AND
def someFun(x:String) = { x.length }
答案 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的定义外,你必须使用等号登录调用声明。
因此没有区别,但不推荐使用第一个,不应该使用它。