Scala - supprimer le fichier s'il existe, de la Scala façon
Comment bien supprimer le fichier dans le Scala, "la Scala"?
Par exemple, je peux utiliser quelque chose comme cela, très Java style:
private def deleteFile(path: String) = {
val fileTemp = new File(path)
if (fileTemp.exists) {
fileTemp.delete()
}
}
Modalités de mise en oeuvre de la Scala, dans la plus fonctionnelle et la syntaxe?
OriginalL'auteur Stas | 2015-05-03
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas vous débarrasser des effets secondaires tout en faisant
IO
-opérations, donc pas de bonne fonctionnelle d'une manière ici. Tous les trucs qui est en fait se termine lorsque vous commencez à interagir avec l'utilisateur/périphériques directement, pas de monade peut vous aider à faire un externe des effets secondaires; toutefois, vous pouvez décrire (wrap) séquentielle des effets secondaires à l'aide de IO-comme des Monades.De parler de votre exemple, monade-restylée code peut ressembler à:
Mais c'est trop verbeux, sans de réels avantages si vous juste voulez supprimer un fichier. De plus,
fileTemp.exists
case n'a pas de sens et n'est pas réellement fiable (comme @Eduardo souligné). Donc, même en Scala, le meilleur moyen que je connaisse est FileUtils.deleteQuietly:Ou même
Il ne va pas faire une exception pour un fichier qui n'existe pas - il suffit de retourner
false
.Si vous voulez vraiment quelque chose de plus Scala façon de regarder ravissement.io par exemple:
Ou scala-io.
Plus d'infos: Comment faire de la création du Fichier et de la manipulation dans le style fonctionnel?
P. S. Cependant, IO-monades peut être utile (contrairement à Certains/Aucun dans mon cas) quand vous avez besoin d'opérations asynchrones, si naïf de code (sans les chats/scalaz) ressemblerait à:
Bien sûr, dans le monde réel, il est préférable d'utiliser certains NIO-wrappers comme FS2-io: https://lunatech.com/blog/WCl5OikAAIrvQCoc/functional-io-with-fs2-streams
et vous avez
None
puis, ce qui est correct 🙂alors pourquoi vérifier?
juste fo amusant, j'ai promis
Monad
de style ici (flatMap), et pas seulementFunctor
(map). Sérieusement, le similaire de vérifier à l'OP de la question n'a pas de sens - j'ai juste traduit pour monadique.Aussi, sur jdk7+ vous pouvez utiliser
Files.deleteIfExists(file.toPath)
ouFiles.deleteIfExists(Paths.get("path/to/file"))
OriginalL'auteur dk14