从Scala in Depth ...
查看此代码scala> trait Foo {
| def someMethod(): Int = 5
| }
defined trait Foo
scala> class Main() extends Foo {
| }
defined class Main
然后,我创建了一个新的Main
(没有括号)。
scala> class Main extends Foo {}
defined class Main
class Main()
中括号的含义是什么? 没有括号怎么样?
答案 0 :(得分:4)
5.3规范:
如果没有给出正式的参数部分,则为空参数部分 ()假设。
这与方法不同,方法可以是无参数的。
写作时
class A
你真的在写
class A()
此外,
scala> class A(implicit i: Int)
defined class A
scala> new A
<console>:9: error: could not find implicit value for parameter i: Int
new A
^
scala> new A()(1)
res1: A = A@32185a4a
scala> new A(1)
<console>:9: error: too many arguments for constructor A: ()(implicit i: Int)A
new A(1)
^
答案 1 :(得分:3)
它是一样的。如果你不使用括号,它就像空括号一样。
class A()
new A()
new A
class B
new B()
new B
一切都是一样。
答案 2 :(得分:2)
在类名后的括号中,您有主构造函数的参数。在这种情况下,没有参数,因此您可以将括号括起来。
答案 3 :(得分:1)
“什么是惯用”的答案似乎实际上取决于所讨论的功能。根据{{3}}的附录A:
“在Scala中,如果函数是引用透明的话,给出零参数的方法没有尾部括号通常是惯用的。”
因此,Thing.foo
没有副作用(它只是检索一个值),没问题。如果foo
有副作用,那么写foo()
就是惯用的,以便读者知道其他事情正在发生。无论哪种方式,Scala都假定括号,而不是 make 你写它们。