Scala中有趣和有趣()之间的区别是什么?

时间:2011-11-22 14:00:03

标签: scala methods

以下是两种方法声明:

def fun = "x"

def fun() = "x"

因为它们都不需要参数并且返回一个String,除了调用方式之外还有什么区别?

4 个答案:

答案 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章