def没有args

Kon*_*tin 9 scala function

如果我创建一个函数:

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",在这种情况下我不能用括号括起来.

这两者有什么区别?

Jea*_*let 11

良好实践建议定义没有副作用的函数(),并()在函数具有副作用时(例如,println()而不是println)在定义站点和调用站点添加两者.


Jes*_*per 6

如果你这样定义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.看看下面,其中xy变成同样的事情:

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)