Scala – 为什么在隐式列表之前声明一个空参数列表
发布时间:2020-12-16 18:31:04 所属栏目:安全 来源:网络整理
导读:某些地方(例如Play Form.bindFromRequest)在隐式参数列表之前使用空参数列表.为什么? 恕我直言,它的缺点是在form.bindFromRequest()(request)中显式传递参数时需要额外的括号. 不知道那有什么优势呢? 解决方法 带有参数列表的def与不带参数列表的类型不同.
某些地方(例如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) ^ 所以想象一下我想存储用户传递给我的一系列回调..我不能使用=>那里: 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(并保持懒惰评估)不是一种选择. 我认为最好不要考虑=> in => T和()=> T表示同样的事情.希望这有所帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |