gpt4 book ai didi

scala - Scala 方法调用中括号的规则是什么?

转载 作者:行者123 更新时间:2023-12-03 06:07:33 25 4
gpt4 key购买 nike

toList 不是一个将某些内容转换为 List 的方法吗?

如果是的话,为什么我不能使用括号呢?我一定错过了一些更基本的东西。

示例如下:

val l = Array(1,2,3).toList // works fine

val l = Array(1,2,3).toList() // gives the error below

Not enough arguments for method apply: (n: Int)Int in trait LinearSeqOptimized. Unspecified value parameter n.

最佳答案

如果方法定义为

def toList = { /* something */ }

那么它必须被称为

object.toList

没有多余的括号。我们说这个方法有零参数列表

我们还可以定义一个参数列表,但在其中不放置任何内容:

def toList() = { /* something */ }

现在,我们可以调用其中任何一个

object.toList()
object.toList

因为 Scala 允许在方法调用时省略括号的快捷方式。

就 JVM 而言,第一个定义(“零参数列表”)和第二个定义(“一个空参数列表”)没有区别。但 Scala 仍然保持着自己的特色。这是否是一个好主意尚有争议,但当您意识到我们也可以时,动机可能会更清晰

def toList()() = { /* something */ }

这被称为两个空参数列表,然后调用其中任何一个

object.toList()()
object.toList()
object.toList

现在,如果我们要将其转换为函数,我们会将其键入为

() => () => T   /* T is the return value of the something */

而第二个定义是

() => T

这在概念上明显不同,即使实际上您以相同的方式使用它(什么都不输入,迟早会得到一个T)。

无论如何,toList 不需要任何参数,Scala 标准是省略括号,除非该方法更改对象本身(而不仅仅是返回某些内容),所以它是 def toList 之后没有任何括号。因此你只能将其称为 object.toList

关于scala - Scala 方法调用中括号的规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6643030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com