获取案例class的自动生成方法的来源
obtaining the source of a case class's automatically generated methods
如何获取一个案例class的所有自动生成方法的代码,以便在重构为常规(非案例)class时干净地保留其中任何一个?是否有一些编译标志揭示案例 class 的自动生成方法,或其他一些方式,最终将其简化为剪切和粘贴?
我的印象是有编译标志来显示自动扩展的定义....
这可能没那么容易。
编译器生成字节代码,因此无法复制编译器输出并粘贴到源代码中。
您可以通读生成的字节代码并手动为类似方法重新创建 Scala 代码。这会有点费力,但方法相对简单,理解字节码是一件好事。
如果某处有可用的 Scala 反编译器,那么反编译已编译的案例 class 将显示您想要的代码。
鉴于这些方法依赖于案例的字段 class,它们不太可能像任何可以复制和粘贴的东西一样在编译器实现中可用。
也许最好的办法是查看语言规范并实现案例 classes 中描述的方法。
您可以看到编译器使用 -Xprint:<phase>
标志将源代码脱糖成什么。对于您的示例(查看为案例 类 生成的代码),运行:
scalac -Xprint:typer YourScala.sca
使用 -Xshow-phases
标志,您将看到所有可用的阶段。
但是您看到的输出不是可编译的 scala 源代码,而是一些中间表示。
如何获取一个案例class的所有自动生成方法的代码,以便在重构为常规(非案例)class时干净地保留其中任何一个?是否有一些编译标志揭示案例 class 的自动生成方法,或其他一些方式,最终将其简化为剪切和粘贴?
我的印象是有编译标志来显示自动扩展的定义....
这可能没那么容易。
编译器生成字节代码,因此无法复制编译器输出并粘贴到源代码中。
您可以通读生成的字节代码并手动为类似方法重新创建 Scala 代码。这会有点费力,但方法相对简单,理解字节码是一件好事。
如果某处有可用的 Scala 反编译器,那么反编译已编译的案例 class 将显示您想要的代码。
鉴于这些方法依赖于案例的字段 class,它们不太可能像任何可以复制和粘贴的东西一样在编译器实现中可用。
也许最好的办法是查看语言规范并实现案例 classes 中描述的方法。
您可以看到编译器使用 -Xprint:<phase>
标志将源代码脱糖成什么。对于您的示例(查看为案例 类 生成的代码),运行:
scalac -Xprint:typer YourScala.sca
使用 -Xshow-phases
标志,您将看到所有可用的阶段。
但是您看到的输出不是可编译的 scala 源代码,而是一些中间表示。