可能重复:
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()
^
那么,何时在运营商之后使用“()”?那有什么模式吗?
非常感谢!
答案 0 :(得分:13)
首先,最好将toLong
和toString
视为Int
类上的方法而不是后缀运算符。整数文字是Scala中的对象,因此有方法,其中两个是toLong
和toString
。 (不可否认,由于隐式转换等原因,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,为了互操作性,它是用括号定义的,因此可以使用或不使用括号来调用。