使用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
以某种方式知道它被调用了什么。这是如何完成的?
答案 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