gpt4 book ai didi

scala - 非方法的 Eta 扩展适用于字段但不适用于局部变量

转载 作者:行者123 更新时间:2023-12-01 12:31:02 28 4
gpt4 key购买 nike

下面的代码几乎是不言自明的:

class EtaExpansionOnNonMethods { // or object
val zero = 0
val zeroEta = zero _ // compiles: () => Int

def f {
val one = 1
val oneEta = one _ // compilation error
}
}
Error:(7, 18) _ must follow method; cannot follow Int    val oneEta = one _                 ^

为什么 eta-expansion 在一个例子上Int 字段允许(导致 () => Int)但不允许 Int 局部变量(导致编译错误)?我使用的是 2.11.7 版。

最佳答案

那是因为 val 成员实际上被编译成类似 getter/setter 的方法,例如运行 javap EtaExpansionOnNonMethods.class ,你会从运行 scalac 给你:

E:\EtaExp>"C:\Program Files\Java\jdk1.8.0_51\bin\javap" EtaExpansionOnNonMethods.class
Compiled from "EtaExp.scala"
public class EtaExpansionOnNonMethods {
public int zero();
public EtaExpansionOnNonMethods();
}

请注意,如果您将成员声明为 private[this] val zero = 0,它被编译成一个 final 字段,您将得到与尝试时完全相同的错误eta 扩展局部变量或值。

最后,一般前提仍然成立:您可以对方法使用 eta 扩展,即使这些方法并不是真正明确的。 :)

关于scala - 非方法的 Eta 扩展适用于字段但不适用于局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34179229/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com