如何将第一个属性用于 scala case class 的第二个属性

how to use first attribute into second attribute from scala case class

我创建了一个这样的案例class:

case class MyClass[T](attName: String, getter: (ResultSet) => T)

我实例化了两个这样的例子:

val ex1 = MyClass("name", (rs: ResultSet) => rs.getString("name"))
val ex2 = MyClass("age", (rs: ResultSet) => rs.getInt("age"))

我想避免在每一行中使用两个时间名称和年龄。你有什么想法在第二个属性中重用 attName 吗?感谢

两个选择:

创建一个对象来保存列名等静态内容并将它们用作变量:

  object MyClass {
    object DbKeys {
      val name = "name"
      val age = "age"
    }
  }

  case class MyClass[T](attName: String, getter: (ResultSet) => T)

  val ex1 = MyClass(DbKeys.name, (rs: ResultSet) => rs.getString(DbKeys.name))
  val ex2 = MyClass(DbKeys.age, (rs: ResultSet) => rs.getInt(DbKeys.age))

仍然是对象,但这次是抽象 class 和 2 个案例 classes。请注意,在实例化时不指定列名。

  object MyClassArg {
    object DbKeys {
      val name = "name"
      val age = "age"
    }
  }

  abstract class MyClassArg[T](attName: String, getter: (ResultSet) => T)
  case class MyClassName() extends MyClassArg(DbKeys.name, (rs: ResultSet) => rs.getString(DbKeys.name))
  case class MyClassAge() extends MyClassArg(DbKeys.age, (rs: ResultSet) => rs.getString(DbKeys.age))

  val ex1 = MyClassName
  val ex2 = MyClassAge

我更喜欢第二种选择,因为它使用起来更干净。您可以使 MyClassArg 成为非抽象的以提供更大的灵活性。

getter也可以进一步抽象,避免重复rs.getString部分。

可能是这样的:

class MyClass[T](name: String, getter: (ResultSet, String) => T) {
   def getIt(rs: ResultSet): T = getter(rs, name)
}

case object MyClassName extends MyClass[String]("name", _ getString _)
case object MyClassAge extends MyClass[Int]("age", _ getInt _)

或者只是

val ex1 = new MyClass("name", _ getString _)
val ex2 = new MyClass("age", _ getInt _)