Решение от Xavier Guihot будет работать с Scala 2.13 , но вы также можете реализовать строковый доступ с shapeless с Scala 2.12 или ниже.
Прежде всего, добавьте бесформенный к вашему build.sbt :
libraryDependencies += "com.chuusai" %% "shapeless" % "2.3.3"
Нам нужно будет использовать LabelledGeneric и ToMap .Мы могли бы реализовать его как класс расширения, работающий с классами case:
object DynamicAccess {
implicit class DynamicAccessOps[R <: HList, T <: Product with Serializable](o: T)(
implicit gen: LabelledGeneric.Aux[T, R],
toMap: ToMap[R]
) {
private lazy val fields = toMap(gen.to(o))
def apply[S](field: String): Option[S] = fields
.get(Symbol.apply(field).asInstanceOf[toMap.Key])
.asInstanceOf[Option[S]]
}
}
Тогда вы можете использовать его следующим образом:
import DynamicAccess._
case class Foo(bar: String, baz: String)
val f = Foo("x", "y")
f[String]("bar") // Some(x)
f[String]("baz") // Some(y)
f[String]("foobar") //None