Scala方法调用中括号的规则是什么?
是不是toList一个方法,将东西转换成一个List?
如果是的话,为什么我不能用括号? 我必须在这里失去更重要的东西。
这是一个例子:
val l = Array(1,2,3).toList // works fine val l = Array(1,2,3).toList() // gives the error below
方法适用的参数不足:(n:Int)特征LinearSeqOptimized中的Int。 未指定的值参数n。
如果一个方法被定义为
def toList = { /* something */ }
那么它必须被称为
object.toList
没有额外的括号。 我们说这个方法有零参数列表 。
我们也可以定义一个参数列表,但是什么也不放:
def toList() = { /* something */ }
现在,我们可以打电话了
object.toList() object.toList
因为Scala允许在方法调用中省略括号的快捷方式。
就JVM而言,第一个定义(“零参数列表”)和第二个(“一个空参数列表”)没有区别。 但斯卡拉保持一个区别。 这是不是一个好主意是值得商榷的,但是当你意识到我们也可以的时候,动机就会更清晰
def toList()() = { /* something */ }
这被称为两个空参数列表 ,然后调用任何一个
object.toList()() object.toList() object.toList
现在,如果我们要把它转换成一个函数,我们可以input它
() => () => T /* T is the return value of the something */
而第二个定义是
() => T
这在概念上是明显不同的,即使实际上你用同样的方法(放弃任何东西,迟早会掉出一个T
)。
无论如何, toList
不需要任何参数,Scala标准是除去方法,除非该方法改变对象本身(而不是仅仅返回一些东西),所以它是没有任何parens之后。 因此,您只能将其称为object.toList
。
你的第二行实际上被解释为
val l = Array(1,2,3).toList.apply()
因为foo(x)
是foo.apply(x)
“魔术”语法。
这就是为什么编译器抱怨“没有足够的参数”,因为list上的apply方法需要一个参数。
因此,你可以写例如:
scala> val i = Array(1, 2, 3).toList(1) i: Int = 2
让我从Scala编码风格的angular度回答。
斯卡拉风格指南说…
省略空括号,只有当问题的方法没有副作用(纯function)时才使用。 换句话说,在调用queue.size时省略括号是可以接受的,但是在调用println()时不行。
宗教地观察这个约定将大大提高代码的可读性,并且使得一目了然地理解任何给定方法的最基本的操作变得更容易。 抵制括号的冲动只是为了保存两个字符!