以下是两种方法声明:
def fun = "x"
def fun() = "x"
因为它们都不需要参数并且返回一个String,除了调用方式之外还有什么区别?
答案 0 :(得分:9)
除了对没有参数的函数没有副作用的约定外, IS 是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()
^
答案 1 :(得分:4)
这只是一个惯例:
obj.fun //accessing like property with no side-effects
obj.fun() //ordinary method call, return value, but might also have side-effects
首选()
版本以强调这是方法而不是简单属性。
请注意,这只是一种约定,一种记录代码的方法,编译器不会强制执行上述规则。
答案 2 :(得分: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
答案 3 :(得分:0)
(附录)您可以在此处找到“纯粹与副作用”的约定:Scala Style Guide第3.4.2章