Saya telah melihat banyak contoh ARM (manajemen sumber daya otomatis) di web untuk Scala. Tampaknya menjadi ritus peralihan untuk menulis satu, meskipun sebagian besar terlihat sangat mirip satu sama lain. Saya memang melihat contoh yang cukup keren menggunakan lanjutan.
Bagaimanapun, banyak dari kode itu memiliki kekurangan dari satu jenis atau lainnya, jadi saya pikir akan menjadi ide yang baik untuk memiliki referensi di Stack Overflow, di mana kita dapat memilih versi yang paling benar dan sesuai.
scala
resource-management
Daniel C. Sobral
sumber
sumber
Jawaban:
Untuk saat Scala 2.13 akhirnya didukung:
try with resources
dengan menggunakan Menggunakan :), Contoh:atau menggunakan
Using.resource
hindariTry
Anda dapat menemukan lebih banyak contoh dari Menggunakan doc.
sumber
Using.resource
varian juga?using
metode yang serupa :def using[A <: AutoCloseable, B](resource: A) (block: A => B): B = try block(resource) finally resource.close()
Entri blog Chris Hansen 'ARM Blocks in Scala: Revisited' dari 3/26/09 berbicara tentang slide 21 presentasi FOSDEM Martin Odersky . Blok berikutnya ini diambil langsung dari slide 21 (dengan izin):
--selesai kutipan--
Kemudian kita bisa memanggil seperti ini:
Apa kelemahan dari pendekatan ini? Pola itu tampaknya menangani 95% tempat saya memerlukan pengelolaan sumber daya otomatis ...
Edit: menambahkan cuplikan kode
Sunting2: memperluas pola desain - mengambil inspirasi dari
with
pernyataan python dan menangani:Managed
kelasIni dengan Scala 2.8.
sumber
Daniel,
Saya baru saja menerapkan pustaka skala-lengan untuk manajemen sumber daya otomatis. Anda dapat menemukan dokumentasinya di sini: https://github.com/jsuereth/scala-arm/wiki
Pustaka ini mendukung tiga gaya penggunaan (saat ini):
1) Imperatif / untuk-ekspresi:
2) Bergaya monadik
3) Gaya Lanjutan Dibatasi
Berikut adalah server tcp "echo":
Kode tersebut menggunakan sifat tipe Sumber Daya, sehingga dapat beradaptasi dengan sebagian besar jenis sumber daya. Ini memiliki fallback untuk menggunakan pengetikan struktural terhadap kelas-kelas dengan metode tutup atau buang. Silakan lihat dokumentasinya dan beri tahu saya jika Anda memikirkan fitur praktis untuk ditambahkan.
sumber
Inilah solusi James Iry menggunakan lanjutan:
Berikut solusi dengan dan tanpa kelanjutan untuk perbandingan:
Dan inilah saran perbaikan Tiark Rompf:
sumber
BufferedWriter
tidak membuang pengecualian yang dicentang, jadi jika ada pengecualian yang dilemparkan, program tidak diharapkan untuk pulih darinya.Saya melihat evolusi 4 langkah bertahap untuk melakukan ARM di Scala:
sumber
Ada ARM ringan (10 baris kode) yang disertakan dengan file yang lebih baik. Lihat: https://github.com/pathikrit/better-files#lightweight-arm
Berikut adalah cara penerapannya jika Anda tidak menginginkan seluruh pustaka:
sumber
map
danflatMap
metode untuk CloseableOps daripada foreach sehingga untuk pemahaman tidak akan menghasilkan sebuah traversable.Bagaimana kalau menggunakan kelas Type
sumber
Alternatif lain adalah monad Choppy's Lazy TryClose. Ini cukup bagus dengan koneksi database:
Dan dengan aliran:
Info lebih lanjut di sini: https://github.com/choppythelumberjack/tryclose
sumber
Berikut adalah jawaban @ chengpohi, dimodifikasi sehingga berfungsi dengan Scala 2.8+, bukan hanya Scala 2.13 (ya, ini juga berfungsi dengan Scala 2.13):
sumber