gpt4 book ai didi

scala - 默认参数值方法位置

转载 作者:行者123 更新时间:2023-12-01 05:53:21 24 4
gpt4 key购买 nike

我正在编写一个宏,我正在尝试为本地案例类找到生成默认值的方法所在的位置。

例如,在顶级案例类中,例如:

package foo

case class Goo(a: String = "wibble")

我可以很容易地找到返回“wibble”的方法 <init>$default$NGoo 的伴随对象上定义.所以像:
val defswithsymbols = universe.asInstanceOf[Definitions with SymbolTable with StdNames]
val defaultGetter = defswithsymbols.nme.defaultGetterName(defswithsymbols.nme.CONSTRUCTOR, index + 1)
val method = tpe.companion.member(TermName(defaultGetter.toString))

然后我可以在 tpe.companion 上调用方法给我默认值。

但是,如果我在方法中定义了一个 case 类,则该类没有伴随对象(我可以找到),因此我无法找到默认参数生成方法。但它必须在正确的地方定义:)

编辑:我认为这个问题可能可以归结为 - 在方法中声明的案例类的伴生对象在哪里?

最佳答案

编译案例类时,编译器会为主类及其伴生对象创建类文件。它对方法内部定义的 case 类执行相同的操作。唯一的区别是创建类文件时使用的文件名使其无法访问。它有点类似于匿名类文件名。

例如:

class TestClass {
new Runnable(){
def run() = {
//some Code
}
}
}

编译上述代码后,编译器可能会生成名为 的类文件。 TestClass$anon$1 .如果您知道此名称,则可以使用反射创建此匿名内部类的实例。

请引用以下示例代码,并在方法中定义案例类。
class TestClass {
def someMethod = {
case class ClassInsideMethod()
}
}

object Main extends App{
val enclosingClass = classOf[TestClass]
val enclosingInstance = Class.forName(enclosingClass.getName).newInstance().asInstanceOf[TestClass]
private val classInsideMethodConstructor = Class.forName(enclosingClass.getName + "$ClassInsideMethod$2").getDeclaredConstructor(enclosingClass)
classInsideMethodConstructor.newInstance(enclosingInstance)
}

我发现在编译代码后,编译器确实为 case 类创建了名为 的类文件。测试类$ClassInsideMethod$2 TestClass$ClassInsideMethod$3$ .类文件附加有一个数字。此命名将根据您的编译器而有所不同。在我的例子中,使用反射我能够创建方法内部定义的 case 类的实例。

TLDR;编译器确实为案例类创建了伴随对象。

我希望这能回答你的问题。

关于scala - 默认参数值方法位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51887148/

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