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()时不行。

宗教地观察这个约定将大大提高代码的可读性,并且使得一目了然地理解任何给定方法的最基本的操作变得更容易。 抵制括号的冲动只是为了保存两个字符!