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
。