case class Foo {
fieldA: Option[Double],
fieldB: Option[Double]
}
val foo = Foo(
fieldA = Some(1.0),
fieldB = Some(2.0)
)
给定字符串"fieldA"
,我想获得foo.fieldA
的值,即Some(1.0)
。是否可以不使用反射,因为代码将用于生产?
答案 0 :(得分:3)
我想简短的回答是" no"。
稍微长一点的答案是,如果你想从任何元素中检索一个字段,只使用一个带有该元素名称的字符串,那么你必须使用反射。
那就是说,你可以编写一个查找函数,如下所示:
case class Foo(fieldA: Option[Double], fieldB: Option[Double]) {
//...
def byFieldName(name: String): Option[Double] = name match {
case "fieldA" => fieldA
case "fieldB" => fieldB
}
}
它有点手册,但它有效。或者,您可以使用反射实现此函数,将结果缓存在Map[String, Option[Double]]
中(假设所有此类字段具有相同的类型)。这样,您只能为每个查找字段获得一次性能。
更新:我应该指出,在任何情况下,也许这不是你想要的。如果您需要按名称检索字段值,以下内容是否适用于您而不是case class
(在 Scala REPL 中演示)?
scala> type Foo = Map[String, Option[Double]]
defined type alias Foo
scala> val foo: Foo = Map("fieldA" -> Some(1.0), "fieldB" -> Some(2.0))
foo: Foo = Map(fieldA -> Some(1.0), fieldB -> Some(2.0))
scala> foo("fieldA")
res0: Option[Double] = Some(1.0)
也就是说,您是否可以使用Map
数据结构来查找带标签的值?