这里有两个方法声明:
def fun = "x"
def fun() = "x"
除了调用方式之外,它们都不需要参数并返回一个字符串,那么它们的区别是什么?
除了对没有参数的函数无副作用的惯例正确之外,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()
^
这只是一个约定:
obj.fun //accessing like property with no side-effects
obj.fun() //ordinary method call, return value, but might also have side-effects
更推荐使用()
版本来强调这是一个方法,而不是简单的属性。
请注意,这只是一种约定,一种文档代码的方式,编译器并不强制执行上述规则。
没有括号的函数通常用于表达没有副作用的功能,正如@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