Scala 隐式类也可以是动态的吗?

Scala 隐式类也可以是动态的吗?,scala,implicit-conversion,Scala,Implicit Conversion,我尝试通过执行以下操作向类隐式添加动态功能: case class C(map: Map[String, String]) implicit class Enhancer(c: C) extends Dynamic { def selectDynamic(str: String) = c.map.getOrElse(str, "") } val c = C(Map("a" -> "A")) 这不会编译 val up = c.a 但明确的呼吁将: val up = Enhan

我尝试通过执行以下操作向类隐式添加动态功能:

case class C(map: Map[String, String])

implicit class Enhancer(c: C) extends Dynamic {
    def selectDynamic(str: String) = c.map.getOrElse(str, "")
}

val c = C(Map("a" -> "A"))
这不会编译

val up = c.a
但明确的呼吁将:

val up = Enhancer(c).a

为什么会这样?

是的,这将编译

val up = Enhancer(c).a  //up: String = A
…但是,这也会

val up = Enhancer(c).wxyz  //up: String = ""
如果类
C
没有成员
a
,而类
Enhancer
没有成员
a
,编译器将不会检查
a
是否动态支持,因为所有内容都是动态支持的

如果我在设计一种语言/编译器时,在允许
a.anything
(因为
Enhancer
Dynamic
)或只允许本机支持的成员(忽略动态)之间做出选择,我想我会选择后者

动态选择

如果之前的转换都不适用,并且
e
是选择的前缀
e.x
,并且
e
的类型符合类
scala.Dynamic
,然后根据动态成员选择规则重写选择


不包括“可以隐式转换”;因此,不能隐式添加
动态
。您可以将其用于Scala的未来版本,但如果它被接受,我会感到惊讶。

但是您可以从C实例访问“selectDynamic”方法。a属性的定义在哪里?在动态?隐式转换(在大多数情况下已经太自动了)+动态。。。这将是一个无法维护代码的公式,我想这就是重点;他们希望编译
c.a
c.wxyz