按价值及;按scala中的名称=>;一一对应

按价值及;按scala中的名称=>;一一对应,scala,callbyname,pass-by-name,Scala,Callbyname,Pass By Name,如果按值调用 valf:(Int)=>Int={(i)=>{i*i}}}f:Int=>Int= 这是英语的简写 valf:Function1[Int,Int]={(i)=>{i*i}}#f:Int=>Int= 然后叫名字的时候 valf:(=>Int)=>Int={(i)=>{i*i}}}f:(=>Int)=>Int= 这是英语的简写 ?什么? 和if 按值调用时 val f={(i)=>{i*i}}:(Int)=>Int#f:Int=>Int= 这是英语的简写 val f=

如果按值调用

valf:(Int)=>Int={(i)=>{i*i}}}f:Int=>Int=

这是英语的简写
valf:Function1[Int,Int]={(i)=>{i*i}}#f:Int=>Int=

然后叫名字的时候
valf:(=>Int)=>Int={(i)=>{i*i}}}f:(=>Int)=>Int=

这是英语的简写
?什么?

和if

按值调用时

val f={(i)=>{i*i}}:(Int)=>Int#f:Int=>Int=

这是英语的简写
val f={(i)=>{i*i}}:函数1[Int,Int]#f:Int=>Int=

然后叫名字的时候
val f={(i)=>{i*i}}:(=>Int)=>Int#f:(=>Int)=>Int=

这是英语的简写
?什么?

换句话说

如果(Int)=>Int函数1[Int,Int]

那么(=>Int)=>Int的缩写吗?什么?


谢谢

在字节码级别,它是以下内容的简写:

Function1[Function0[Int], Int]
如果您想从另一种JVM语言调用这样的Scala代码,则必须填充该签名


看,你在scaladoc中找不到它,它不是任何东西的简写。按名称类型是按名称类型。见SLS 4.6.1

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


另请参见:

谢谢Chirlo,但是,“Function1[Function0[Int],Int]”的签名似乎是“(()=>Int)=>Int=”而不是“(=>Int)=>Int=”。Scala不允许我声明它(甚至不允许编译):“val f:Function1[Function0[Int],Int]={(i)=>{i*i}}”作为val f:(=>Int=>Int=>Int={(i)=>{i*i}}的等价物。一个可接受的声明是“val f:Function1[Function0[Int],Int]={(i)=>i()}”,尽管它不是1对1的等价物,我更新了我的答案,这是基于scalac生成的字节码。谢谢Seth。我担心这就是答案,坦率地说,我不喜欢这个事实。对我来说,这是一种语言不一致。无论如何,最好知道(至少对于当前的Scala版本2.11.6)不存在这样的等价性。(我目前了解到Scala试图将遇到的东西组织起来,但在本例中,我所寻找的模式并不适合)