获取属性名称隐式方法被调用

时间:2014-04-10 22:07:13

标签: scala reflection

使用Scala,我希望实现以下目标:

// SETUP:

implicit class ExampleOps(s: String) {
  def name: String = ???
}

case class Example(prop1: String, prop2: String)
val e = Example("a", "b")

// BEHAVIOR I WANT:

e.prop1.name // should return "prop1"

在这种情况下def name以某种方式知道它被调用了什么。这是如何完成的?

1 个答案:

答案 0 :(得分:0)

正如我在评论中所解释的那样,宏可以在一定程度上使用。但是,他们无法神奇地恢复丢失的一些信息。例如,如果将属性值存储在任意变量中,则无法确定从哪个属性读取它:

val x: String = e.prop1
x.name  // no way to know if came from calling e.prop1

所以我认为唯一的解决方案是使用自定义类型。您可以允许它们隐式地展开为字符串:

object Property {
  implicit def value[A](prop: Property[A]): A = prop.value
}
case class Property[+A](name: String, value: A)

case class Example(value1: String, value2: String) {
  def prop1 = Property("prop1", value1)
  def prop2 = Property("prop2", value2)
}

val e = Example("a", "b")
e.prop1.toUpperCase
e.prop1.name