何时需要(或禁止)方法的括号?

时间:2012-03-19 02:37:14

标签: scala

  

可能重复:
  What is the rule for parenthesis in Scala method invocation?

我是Scala的新手,我对后缀运算符上的()有一些困惑

我被告知toLong和toString是任何整数的后缀运算符,所以我尝试了以下操作:

scala> 7 toString
res18: java.lang.String = 7

scala> 7.toString()
res19: java.lang.String = 7

scala> 7.toString
res20: java.lang.String = 7

scala> 7.toLong
res21: Long = 7 

scala> 7.toLong()
<console>:8: error: Long does not take parameters
              7.toLong()
                      ^

那么,何时在运营商之后使用“()”?那有什么模式吗?

非常感谢!

2 个答案:

答案 0 :(得分:13)

首先,最好将toLongtoString视为Int类上的方法而不是后缀运算符。整数文字是Scala中的对象,因此有方法,其中两个是toLongtoString。 (不可否认,由于隐式转换等原因,Int的情况稍微复杂一些,但这是一种将其视为初学者的好方法。)

那么删除括号的规则是什么?如果方法不接受任何参数,则Scala语法允许您删除()。但是,如果定义的方法没有括号,则根本不允许使用它们:

class A() {
  def stuff() = "stuff"
  def things = "things"
}

val a = new A()

a.stuff     // fine
a.stuff()   // fine
a.things    // fine
a.things()  // error!

最后,你什么时候放下括号,什么时候保留它们?按照惯例,在Scala中,我们删除没有副作用的方法的括号,并在有副作用时保留它们。显然,这只是一种风格,但它为读者提供了关于代码如何工作的额外线索。

答案 1 :(得分:5)

有关详细信息,请参阅What is the rule for parenthesis in Scala method invocation?

另外Int.toLong的定义没有括号,因此不能用括号调用。它很可能没有括号定义,因为它没有副作用(这是一种惯例)。

由于toString()来自Java,为了互操作性,它是用括号定义的,因此可以使用或不使用括号来调用。