gpt4 book ai didi

Scala - 为什么在隐式列表之前声明空参数列表

转载 作者:行者123 更新时间:2023-12-04 21:40:03 27 4
gpt4 key购买 nike

某些地方(例如 Play Form.bindFromRequest )在隐式参数列表之前使用空参数列表。为什么?
恕我直言,当参数被显式传递时,它的缺点是需要额外的括号,如 form.bindFromRequest()(request) .
不知道有什么好处呢?

最佳答案

一个 def带有参数列表的类型与没有参数列表的类型不同。这在直接调用下无关紧要,但是如果您将该方法作为参数传递给另一个方法,则它会起作用。

例如,如果您像这样定义方法:

def func1 = { println("Hello"); 1 }

你不能把它传递给这个方法:
def consume(f: () => Double) = // ...

因为它的类型只是 Double 类型,尽管它非常懒惰。另一方面,此功能将正常工作:
def func2() = { println("Hello"); 2 }

我并不是说这是他们这样做的明确原因,但如果他们有一个实际的原因,它几乎肯定会与类型有关。

编辑:

实际上,它们之间的区别主要取决于它们可以使用的地方。

call-by-value 项只能在函数/方法的参数列表中使用(afaik)。由于它只能在参数列表中传递,因此您不能将其存储在变量中并在多个位置使用它(无需将其更改为 T 的显式实例)。

正如您在此处看到的,它们本身不可互换:
scala> def f(s: => String) { println(s) }
f: (s: => String)Unit

scala> def s1 = () => { "Hello" }
s1: () => String

scala> f(s1)
<console>:10: error: type mismatch;
found : () => String
required: String
f(s1)
^

所以想象一下我想存储用户传递给我的回调数组..我不能使用 => T这里:
scala> val a: Array[=> Int] = Array()
<console>:1: error: identifier expected but '=>' found.
val a: Array[=> Int] = Array()
^

scala> val a: Array[() => Int] = Array()
a: Array[() => Int] = Array()

因此,如果我想存储此类项目,并在内部传递它们,请使用 => T (并对其进行懒惰评估)不是一种选择。

我觉得最好不要想 =>=> T() => T因为意思是一样的。希望这有所帮助。

关于Scala - 为什么在隐式列表之前声明空参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28786604/

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