在Scala中,fun和fun()有什么区别?

6

这里有两个方法声明:

def fun = "x"

def fun() = "x"

除了调用方式之外,它们都不需要参数并返回一个字符串,那么它们的区别是什么?

4个回答

12

除了对没有参数的函数无副作用的惯例正确之外,Scala中'fun'和'fun()'之间确实存在差异。

'fun'被称为'无参数'函数,而'fun()'是带有'空参数列表'的函数。

长话短说:

scala> def fun() = "x"
fun: ()java.lang.String

scala> fun
res0: java.lang.String = x

scala> fun()
res1: java.lang.String = x

scala> def fun = "y"
fun: java.lang.String

scala> fun
res2: java.lang.String = y

scala> fun()
<console>:9: error: not enough arguments for method apply: (index: Int)Char in class StringOps.
Unspecified value parameter index.
              fun()
             ^

你能详细说明一下最后一个案例的错误信息吗?那是什么意思啊? - Jan

4

这只是一个约定:

obj.fun   //accessing like property with no side-effects

obj.fun() //ordinary method call, return value, but might also have side-effects 

更推荐使用()版本来强调这是一个方法,而不是简单的属性。

请注意,这只是一种约定,一种文档代码的方式,编译器并不强制执行上述规则。


3

没有括号的函数通常用于表达没有副作用的功能,正如@Tomasz所指出的那样(例如,字符串长度-只要您拥有相同的字符串,长度将是相同的)

如果您定义了没有括号的函数,则在调用函数时无法使用它们:

scala> def fun = "x"
fun: java.lang.String

scala> fun
res0: java.lang.String = x

scala> fun()
<console>:9: error: not enough arguments for method apply: (n: Int)Char in trait StringLike.
Unspecified value parameter n.
       fun()
          ^

scala> def fun() = "x"
fun: ()java.lang.String
//now you may use () or may not - it is up to you
scala> fun
res2: java.lang.String = x

scala> fun()
res3: java.lang.String = x

0
(附录)您可以在这里找到“纯函数 vs 副作用”的约定:Scala 风格指南 第3.4.2章节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接