考虑我们有一个Foo
带有方法的类bar
(它不接受任何参数并返回字符串"bar"
)。实现bar有两种方式
第一个是
class Foo {
def bar() = "bar"
}
第二个是
class Foo {
def bar = "bar"
}
虽然两者的作用基本相同,但它们的名称需要不同,第一个像这样
someFoo.bar()
第二个
someFoo.bar
为什么我应该使用一个而不是另一个,根本区别是什么?
考虑我们有一个Foo
带有方法的类bar
(它不接受任何参数并返回字符串"bar"
)。实现bar有两种方式
第一个是
class Foo {
def bar() = "bar"
}
第二个是
class Foo {
def bar = "bar"
}
虽然两者的作用基本相同,但它们的名称需要不同,第一个像这样
someFoo.bar()
第二个
someFoo.bar
为什么我应该使用一个而不是另一个,根本区别是什么?
定义一个不带括号的参数的方法意味着该方法是纯的(它没有副作用并且不依赖于程序的状态)。此类方法不能用括号调用:
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
它们都不需要用括号调用。Yetdef bar = "bar"
需要在没有括号的情况下被调用,因为括号将被暗示应用于它的结果,因此在这种情况下调用bar()
将具有与 . 相同的效果"bar"()
。
这只是约定俗成的问题。在我的实践中,我看到了两个:
print
不带括号的方法。Bozhidar 提出了另一个约定,但老实说,这是我第一次接触它。