如果我创建一个函数:
def a(): String = return "some string"
结果将是“a :()String” 所以我可以使用/不带括号
另一方面,如果我创建相同的功能
def a:String = return "some other string"
它只是“a:String” 在这种情况下,我不能用括号括起来。
这两者有什么区别?
答案 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
。看一下以下内容,其中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>