在Scala中使用字符串识别对象字段

Jos*_*iga 3 scala ecmascript-6

ES6中,我们可以将对象的字段称为:

seller['firstname']  
Run Code Online (Sandbox Code Playgroud)

代表

seller.firstname
Run Code Online (Sandbox Code Playgroud)

有没有办法在Scala中做同样的事情?我的意思是,使用字符串来引用对象字段?

Xav*_*hot 6

使用Scala 2.13,您应该能够通过使用案例类的新productElementNames方法(在其字段名称上返回迭代器)来做更多或更少的事情。

通过用获得的字段值压缩字段名称,productIterator我们可以使用字段名称的字符串版本来访问案例类字段值:

implicit class CaseClassExtensions(obj: Product) {

  def select[T](field: String): Option[T] =
    (obj.productElementNames zip obj.productIterator)
      .collectFirst { case (`field`, value) => value.asInstanceOf[T] } 
}
Run Code Online (Sandbox Code Playgroud)
implicit class CaseClassExtensions(obj: Product) {

  def select[T](field: String): Option[T] =
    (obj.productElementNames zip obj.productIterator)
      .collectFirst { case (`field`, value) => value.asInstanceOf[T] } 
}
Run Code Online (Sandbox Code Playgroud)

在这里,隐式类用于丰富Product类型(这是case类的继承类型),以便select在任何case类上调用此方法。


但是与您在Java语言中习惯的相反:

  • 这仅限于案例类。
  • 这将返回Option的值(或者,当您尝试获取未定义的字段的值时,您必须处理异常)。
  • 您必须指定关联值的返回类型。