考虑我们有一个类Foo
,其方法为bar
(它不接受任何参数并返回字符串"bar"
)。有两种方法可以实现bar
第一个是
class Foo {
def bar() = "bar"
}
第二个是
class Foo {
def bar = "bar"
}
虽然两者基本相同,但它们需要以不同方式调用,第一个就像这样
someFoo.bar()
和第二个
someFoo.bar
为什么我要使用一个而另一个又有什么根本区别?
答案 0 :(得分:1)
在没有括号的情况下定义没有参数的方法意味着该方法是纯(它没有副作用,并且不依赖于程序的状态)。这些方法不能用括号调用:
class Square(val side: Int) {
def area = side * side
}
s = new Square(10);
s.area //ok
s.area() //compilation error
使用括号调用不带参数的方法意味着该方法有一些副作用,返回类型为Unit
。使用或不使用空括号定义的方法可以使用或不使用它们进行调用。
class Foo {
def bar(): Unit = println("bar")
}
f = new Foo();
f.bar; //ok, bad style
f.bar(); // good
答案 1 :(得分:1)
他们都不需要用parantheses调用。然而,def bar = "bar"
需要在没有parantheses的情况下被调用,因为这些parantheses将被暗示应用于它的结果,因此在这种情况下,调用bar()
将具有与"bar"()
相同的效果。 / p>
这只是一个惯例问题。在我的实践中,我见过两个:
print
进行了操作。Bozhidar提出了另一个惯例,但老实说,这是我第一次接触它。