я хочу сделать функцию параметром построения класса.
У меня есть некоторые функции, которые я хочу вычислить в классе (какой-то ленивый расчет)
class Foo(calc: PGSimpleDataSource => Connection => PreparedStatement => ResultSet => Option[A] ??? ) {
here some logic like:
def runCalc = calc ( resultSet ( preparedStatement ( connection )
resultSet.close()
preparedStatement.close()
connection.close()
send result somewhere ...
}
подготовить некоторые функции
implicit val dataSource: PGSimpleDataSource = Service.ds
implicit def getConnection(implicit ds: PGSimpleDataSource): Connection = ds.getConnection
implicit def getPreparedStatement(userId: UUID)(implicit con: Connection): PreparedStatement ={
val st = con.prepareStatement("SELECT * FROM bar WHERE id = CAST(? as UUID)")
st.setString(1, id.toString)
st
}
implicit def getResultSet(implicit ps: PreparedStatement): ResultSet = ps.executeQuery()
implicit def mapping(implicit rs: ResultSet): Option[Bar] = {
Iterator.continually(rs.next)
.takeWhile(identity)
.map(_ => Bar(UUID.fromString(rs.getString(1)))).toList.headOption
}
, а затем некоторые функции, такие как:
def getInstance(id: UUID) = new Foo(???)
val foo = getInstance(id)
foo.runCalc()
Возможно ли это? Пожалуйста, помогите
обн .:
Я пытался сделать свой класс так:
class Foo[A](
con: => Connection,
ps: => PreparedStatement,
rs: => ResultSet,
mapping: => Option[A],
calc: Connection => PreparedStatement => ResultSet => Option[A]
) {
def run(): Unit = {
val result: Option[A] = calc(con)(ps)(rs)(mapping)
rs.close()
ps.close()
con.close()
}
}
но я не понимаю, как написать функцию "f", как написано ниже
необходимо выполнить сопоставление (getResultSet (getPreparedStatement (id, getConnection)) *
другими словами, для отображения требуется ResultSet, для которого требуется PreparedStatement, для которого требуется Id и Connection