在 scala 中按值和按名称 => 一一对应

by value & by name in scala => one to one correspondence

如果按值调用

val f: (Int) => Int = {(i) => {i * i}} # f: Int => Int = <function1>
shorthand 是
val f: Function1[Int, Int] = {(i) => {i * i}} # f: Int => Int = <function1>

然后当通过名字调用时
val f: (=> Int) => Int = {(i) => {i * i}} # f: (=> Int) => Int = <function1>
shorthand 是
?什么?

如果

按值调用

val f = {(i) => {i * i}}:(Int) => Int # f: Int => Int = <function1>
shorthand 是
val f = {(i) => {i * i}}:Function1[Int, Int] # f: Int => Int = <function1>

然后当通过名字调用时
val f = {(i) => {i * i}}:(=>Int) => Int # f: (=> Int) => Int = <function1>
shorthand 是
?什么?

换句话说

if (Int) => Int 对于 Function1[Int, Int]

是 shorthand

那么 (=> Int) => Int 是 shorthand for ?什么?

谢谢!

在字节码级别,它是 shorthand for :

Function1[Function0[Int], Int]

如果您想从另一种 JVM 语言调用此类 Scala 代码,则必须填写该签名。

参见the source code for Function0,你不会在scaladoc中找到它

它 shorthand 没有任何意义。别名类型是别名类型。请参阅 SLS 4.6.1,http://www.scala-lang.org/files/archive/spec/2.11/04-basic-declarations-and-definitions.html#by-name-parameters

确实,如果您查看生成的字节码,您会发现参数将作为 Function0 传递,但这是字节码级别的实现细节。在语言级别,别名类型不仅仅是语法糖。它们是实际类型(尽管它们只能作为参数类型出现,而不能出现在其他上下文中)。

另请参阅:Use of Scala by-name parameters