什么';Scala中fun和fun()的区别是什么?

什么';Scala中fun和fun()的区别是什么?,scala,methods,Scala,Methods,以下是两种方法声明: def fun = "x" def fun() = "x" 由于它们都不需要参数并返回字符串,除了调用方式之外还有什么区别?这只是一种约定: obj.fun //accessing like property with no side-effects obj.fun() //ordinary method call, return value, but might also have side-effects 首选()版本,以强调这是一种方法,而不是简单属性

以下是两种方法声明:

def fun = "x"

def fun() = "x"

由于它们都不需要参数并返回字符串,除了调用方式之外还有什么区别?

这只是一种约定:

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
scala>def fun=“x”
乐趣:java.lang.String
scala>乐趣
res0:java.lang.String=x
scala>fun()
:9:错误:trait StringLike中没有足够的参数用于方法apply:(n:Int)Char。
未指定值参数n。
乐趣
^
scala>def fun()=“x”
乐趣:()java.lang.String
//现在您可以使用()也可以不使用,这取决于您自己
scala>乐趣
res2:java.lang.String=x
scala>fun()
res3:java.lang.String=x

(附录)你可以在这里找到“纯与副作用”的约定:第3.4.2章除了对没有参数的函数没有副作用的约定是正确的之外,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()
             ^
scala>def fun()=“x”
乐趣:()java.lang.String
scala>乐趣
res0:java.lang.String=x
scala>fun()
res1:java.lang.String=x
scala>def fun=“y”
乐趣:java.lang.String
scala>乐趣
res2:java.lang.String=y
scala>fun()
:9:错误:StringOps类中没有足够的参数用于方法apply:(索引:Int)Char。
未指定值参数索引。
乐趣
^

您能详细说明最后一个案例的错误信息吗?那到底是什么意思,伊恩?