【发布时间】:2012-12-25 21:32:57
【问题描述】:
假设我有一门课:
case class Foo(id: Int, name: String, note: Option[String] = None)
自动生成的伴生对象中的构造函数和apply方法都接受三个参数。通过反射查看时,第三个参数(注释)被标记:
p.isParamWithDefault = true
另外,通过检查,我可以找到在伴随对象中产生值的方法:
method <init>$default$3
和
method apply$default$3
两者都有:
m.isParamWithDefault = true
但是,我无法在 notes 参数的 TermSymbol 上找到任何实际指向正确方法以获取默认值的内容,也无法在上述 MethodSymbols 上找到任何指向该参数的 TermSymbol 的内容。
是否有直接的方法将参数的 TermSymbol 与生成其默认值的方法联系起来?还是我需要做一些笨拙的事情,比如检查伴随对象上的方法名称?
我对这里的案例类构造函数示例和常规方法都感兴趣。
【问题讨论】:
-
有一定程度的混搭。 [this answer.][1] [1] 处的示例代码:stackoverflow.com/a/13813000/1296806
-
是的,我编写了类似的代码。但它依赖于 Scala 的名称修饰方案,应该被视为实现细节。事实上,现在有一个线程正在进行:groups.google.com/d/topic/scala-internals/aE81MVdIhCk/…
-
是的,也在跟帖;我的兴趣源于需要从默认参数到方法等的 PR,内部很混乱,更不用说外部了。但如前所述,mangle 的形式是指定的。
-
如果我理解正确,默认参数方法的名称修改是在命名和默认参数的 SID 中指定的,但它不在 SLS 中。我不确定,但我不认为 SID 被视为实现必须符合的硬规范。它们是更通用的设计文档。
-
我的答案编辑包括两个 SLS 位置。你会认为这将是 impl 细节。我的用例是,我创建了一个带有可选消息的愚蠢异常类,我不想为默认 arg 生成一个伴侣。另一种方法是重载构造函数,就像你通常手动做的那样。
标签: scala reflection scala-2.10