加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala:得到param默认值:无法在companion对象中访问`apply $def

发布时间:2020-12-16 09:59:50 所属栏目:安全 来源:网络整理
导读:我正在编写一个需要获取构造函数参数的默认值的宏. This answer显示这可以通过访问伴随对象上的编译器生成的方法apply $default $i来完成,其中apply是构造函数的名称,i是基于1的参数索引. 但是,如果从伴随对象本身内部调用宏,则此方法不起作用.据推测,伴随对
我正在编写一个需要获取构造函数参数的默认值的宏. This answer显示这可以通过访问伴随对象上的编译器生成的方法apply $default $i来完成,其中apply是构造函数的名称,i是基于1的参数索引.

但是,如果从伴随对象本身内部调用宏,则此方法不起作用.据推测,伴随对象中代码的类型检查发生在编译器生成apply $default $i方法之前.

此代码有效(无论是手动编写还是由宏生成):

case class C(i: Int = 1)
object C 
def x: Int = C.apply$default$1

但这不是:

case class C(i: Int = 1)
object C {
  def x: Int = C.apply$default$1
}

scalac抱怨值应用$default $1不是对象C的成员.

我需要从伴随对象调用宏,因为宏定义了一个隐式类型类实例.

我可以生成代码,在运行时使用反射来访问apply $default $i方法.但这不够优雅.如果我知道编译器将生成某种方法,我该如何在编译的代码中访问它?

解决方法

Here is the relevant comment.

// Default getters of constructors are added to the companion object in the
  // typeCompleter of the constructor (methodSig).

也许您的宏可以替换您自己的名字in the attachment同时输入您的其他方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读