Scala 2.10传递字段作为参数

时间:2013-08-20 11:45:51

标签: reflection implicit-conversion implicit scala-2.10 scala-macros

想一个像这样的案例类:

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)
}

我可以手工将字段名作为字符串传递,但问题是,如果我重构字段名并且它必须匹配,字符串就不会改变。

也许宏可以帮忙?还有其他解决方案吗?

2 个答案:

答案 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)

如果在编译时已知字段名,则可以使用宏。否则,您可以使用运行时反射。因此,运行时反射为您提供了更大的灵活性,而宏为您提供了更好的性能和编译时间安全性。