加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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表示同样的事情.希望这有所帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读