0

想到一个案例类的这样的:斯卡拉2.10通行证字段作为参数

case class User(firstname: String, lastname: String) 

现在想调用的方法check与姓

check(User.firstname) 

的问题是,该方法check绝也有该领域的名字。它必须具有字段名和fieldValue方法 - >“名字”和“约翰”

的问题是,是否有可能通过在样式check(User.firstname)一类,而不是其价值的领域?

我想检查可能看起来像这样(preudocode):

def check(fieldName: String, fieldValue: Any) = { 
    println(fieldName + ": " + fieldValue) 
} 

或本

def check(field: Field) = { 
    println(field.getName) 
} 

我可以通过字段名作为手串,但问题是,该字符串不如果我重构字段名并且它必须匹配,则更改。

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

回答

1

enter link description here首先我假设check方法总是返回相同的类型(Unit \ String),否则你需要使用泛型。 第二,你可以使用枚举映射

myEnum match { 
    case MyEnum.firstname => myObj.firstname 
    case MyEnum.lastname =>myObj.lastname 
    case _ => .... 

} 

,如果你不想使用枚举,你将不得不使用Scala的反射。 Scala 2.10 reflection, how do I extract the field values from a case class

+0

问题是当我重构我的类的字段名时枚举名不会自动更改,但它们必须匹配。我可以通过手动反射和场地(实际上我正在这样做)来获得场地,但这会导致非常不舒服的API。 – maklemenz

+0

我想不出其他解决方案。 你可以使用动态特征,以获得更好的api http://www.scala-lang.org/api/current/index.html#scala.Dynamic –

0

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