1

如果按值调用时

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

那么当按名称 调用时
val f: (=> Int) => Int = {(i) => {i * i}} # f: (=> Int) => Int = <function1>
是 ? 的简写
?什么 ?

而如果

按值调用时

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

那么当按名称 调用时
val f = {(i) => {i * i}}:(=>Int) => Int # f: (=> Int) => Int = <function1>
是 ? 的简写
?什么 ?

换句话说

if (Int) => IntFunction1[Int, Int]的简写

那么(=> Int) => Int? 什么 ?

谢谢 !

4

2 回答 2

1

在字节码级别,它是 的简写:

Function1[Function0[Int], Int]

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

查看Function0 的源代码,你不会在 scaladoc 中找到它

于 2015-05-11T11:46:14.647 回答
1

它不是任何东西的简写。按名称类型是按名称类型。请参阅 SLS 4.6.1,http://www.scala-lang.org/files/archive/spec/2.11/04-basic-declarations-and-definitions.html#by-name-parameters

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

另请参阅:Scala 名称参数的使用

于 2015-05-11T12:25:32.190 回答