def没有args

时间:2011-05-01 20:27:20

标签: scala function

如果我创建一个函数:

def a(): String = return "some string"

结果将是“a :()String” 所以我可以使用/不带括号

另一方面,如果我创建相同的功能

def a:String = return "some other string"

它只是“a:String” 在这种情况下,我不能用括号括起来。

这两者有什么区别?

2 个答案:

答案 0 :(得分:10)

良好做法建议在没有()的情况下定义没有副作用的函数,并在函数有副作用时在定义站点和调用站点添加()(例如println()而不是println)。

答案 1 :(得分:6)

如果你这样定义a,没有括号(注意,不需要return关键字):

def a: String = "some other string"

然后用括号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()
        ^

因此,在第二种情况下,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>