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

Voi*_*ain 6 scala

可能重复:
Scala方法调用中括号的规则是什么?

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

我被告知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()
                      ^
Run Code Online (Sandbox Code Playgroud)

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

十分感谢!

dhg*_*dhg 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!
Run Code Online (Sandbox Code Playgroud)

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


huy*_*hjl 5

请参阅Scala方法调用中括号的规则是什么?了解详细信息.

另外Int.toLong定义没有括号,因此不能用括号调用.它很可能是在没有括号的情况下定义的,因为它没有副作用(这是一种约定).

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

  • 我刚刚发现`(123.toString())(1)`是''2'`但是`(123.toString)(1)`是一个错误,因为它试图将`1`作为参数传递给`toString()`方法.有点意外. (2认同)