Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
ça gère bien les ressources Scala
object Control {
def using[Closeable <: {def close(): Unit}, B](closeable: Closeable)(useCloseable: Closeable => B): B =
try {
useCloseable(closeable)
} finally {
closeable.close()
}
}
class TestSql {
import java.sql._
import Control._
def query[B](connection: Connection, sql: String)(process: ResultSet => B): B =
using (connection) { connection =>
using (connection.createStatement) { statement =>
using (statement.executeQuery(sql)) { results =>
process(results)
}
}
}
}
class TestReader {
import java.io._;
import Control._
def run() : Unit =
using(new FileReader("FileReaderDemo.java")) {
reader => val br = new BufferedReader(reader);
var s:String = null ;
// the following is boring... you don't read files this way in scala.
}
}
@fsarradin

This comment has been minimized.

Copy link

@fsarradin fsarradin commented Jul 6, 2011

+1. Je m'étais amusé à faire la version SQL. C'est vrai que c'est sympa. Ca rappelle le with en Python.

@ahoy-jon

This comment has been minimized.

Copy link
Owner Author

@ahoy-jon ahoy-jon commented Jul 6, 2011

ha oui, le with ! Il faudrait que quelqu'un/je fasse le bout pour JMS, je n'ai jamais touché à cette techno, mais je vais essayer de trouver un bout de code. Cela pourrait être intéressant, surtout si la signature change ou autre (je pense que cela tient bien la surcharge).

@fsarradin

This comment has been minimized.

Copy link

@fsarradin fsarradin commented Jul 6, 2011

Par contre :

  • linge 7 => je pense qu'il faut entourer le close() par un try/catch et indiquer que close() peut retourner un exception
  • ligne 17 => effet de bord sur le paramètre connection : tu fermes une connexion ouverte !
    Il me semble que j'étais tombé sur ce genre de problème. Du coup, j'ai abandonner car ça devenait compliquer :( (la faute à l'API java)
@ahoy-jon

This comment has been minimized.

Copy link
Owner Author

@ahoy-jon ahoy-jon commented Jul 6, 2011

  • ligne 7, ben non, on catch l'exception plus haut, si cela arrive plus bas, finally marche quand même (ou je n'ai pas compris).
  • ligne 17. Si ta connexion vient d'un pool de connexions (++ pour les pools de connexions), alors close va faire un retour au pool. Sinon, la fonction que tu passes en entrée de using fait tout ce que tu as à faire avec cette connexion (quitte à retourner Unit/void).

Pour les effets de bord ... on est déjà sur du pur IO là ;)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment