想一个像这样的案例类:
case class User(firstname: String, lastname: String)
现在考虑使用名字
调用方法check
check(User.firstname)
问题是,方法check
也必须具有该字段的名称。它必须具有fieldname和fieldvalue - > "姓名"和"约翰"
问题是,是否可以在样式check(User.firstname)
中传递类的字段而不是其值?
我认为支票看起来像这样(preudocode):
def check(fieldName: String, fieldValue: Any) = {
println(fieldName + ": " + fieldValue)
}
或者
def check(field: Field) = {
println(field.getName)
}
我可以手工将字段名作为字符串传递,但问题是,如果我重构字段名并且它必须匹配,字符串就不会改变。
也许宏可以帮忙?还有其他解决方案吗?
答案 0 :(得分:1)
enter link description here首先我假设check方法总是返回相同的类型(Unit \ String),否则你需要使用泛型。 第二,您可以使用Enums进行映射
myEnum match {
case MyEnum.firstname => myObj.firstname
case MyEnum.lastname =>myObj.lastname
case _ => ....
}
如果您不想使用Enums,则必须使用scala反射。 Scala 2.10 reflection, how do I extract the field values from a case class
答案 1 :(得分:0)
如果在编译时已知字段名,则可以使用宏。否则,您可以使用运行时反射。因此,运行时反射为您提供了更大的灵活性,而宏为您提供了更好的性能和编译时间安全性。