Scala 这两种方法定义之间的区别是什么?
可能重复:Scala 这两种方法定义之间的区别是什么?,scala,Scala,可能重复: 假设我们有一个类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
def bar=“bar”
时需要不带偏执,因为偏执将被暗示应用于它的结果,因此在这种情况下,调用bar()
将具有与“bar”(
相同的效果- 标准(用于标准库和大多数第三方库)。当这种方法没有副作用时,不要妄想。“纯”,即除了不会引起任何副作用外,也不取决于状态,但这不是一项要求。根据这个惯例,你的第二个例子是正确的
- 斯卡拉兹。每当方法没有参数时,即该方法可能产生副作用时,请删除偏执。例如,他们在没有括号的情况下推销一种方法
print
Bozhidar提出了另一个约定,但老实说,这是我第一次接触到它。我认为这是我在上面看到的scala标记最常见的问题之一:)它们需要以不同的方式调用实际上,没有什么能阻止您调用用括号定义的方法,而不使用大括号:
def foo(){};foo
(但反之亦然)你不是指“定义”而不是“调用”吗?