如果我创建一个函数:
def a(): String = return "some string"
Run Code Online (Sandbox Code Playgroud)
结果将是"a :()String"所以我可以使用/不带括号
另一方面,如果我创建相同的功能
def a:String = return "some other string"
Run Code Online (Sandbox Code Playgroud)
它只是"a:String",在这种情况下我不能用括号括起来.
这两者有什么区别?
如果你这样定义a,没有括号(注意,return不需要关键字):
def a: String = "some other string"
Run Code Online (Sandbox Code Playgroud)
然后用括号:来调用它a(),然后()不是方法的空参数列表a; 相反,Scala将尝试()将该方法应用于该方法a返回的String .您尝试提示时得到的错误消息:
scala> a()
<console>:7: error: not enough arguments for method apply: (n: Int)Char in trait StringLike.
Unspecified value parameter n.
a()
^
Run Code Online (Sandbox Code Playgroud)
所以,在第二种情况下,a()意味着除了第一种情况之外的其他东西.在第一种情况下,它只是意味着" a使用空参数列表调用",而在第二种情况下,它意味着"调用a,然后应用于()方法的结果",这将在a上失败String.
编辑要在下面的评论中扩展您的第二个问题,这取决于您对"同一件事"的确切含义.正如你在REPL中看到的那样,它看起来像是有类型()java.lang.String而另一个有类型java.lang.String.看看下面,其中x并y变成同样的事情:
scala> def a() = "aaa"
a: ()java.lang.String
scala> def b = "bbb"
b: java.lang.String
scala> val x = a _
x: () => java.lang.String = <function0>
scala> val y = b _
y: () => java.lang.String = <function0>
Run Code Online (Sandbox Code Playgroud)