2015-05-03 16 views
9

Scala'da "Scala yolu" nasıl silinir?Scala - varsa silme yolu, Scala yolu

Örneğin, ben, böyle bir şey kullanabilirsiniz çok Java tarzı:

daha işlevsel bir sözdiziminde, Scala uygulanacağına dair nasıl
private def deleteFile(path: String) = { 
    val fileTemp = new File(path) 
    if (fileTemp.exists) { 
     fileTemp.delete() 
    } 
    } 

?

cevap

16

Sen IO -operations yaparken yan etkiler kurtulmak, işte hiç iyi fonksiyonel yolları olsun olamaz. Kullanıcı/cihazlarla doğrudan etkileşime geçtiğinizde tüm işlevsel şeyler aslında sona erer, hiçbir monad bir harici yan etki yapmanıza yardımcı olamaz; Ancak, IO benzeri Monad'ları kullanarak (sarma) sıralı yan etkileri tanımlayabilirsiniz. senin Örneğin bahsedersek

, monad-restyled kod gibi görünebilir:

implicit class FileMonads(f: File) { 
    def check = if (f.exists) Some(f) else None //returns "Maybe" monad 
    def remove = if (f.delete()) Some(f) else None //returns "Maybe" monad 
} 

for { 
    foundFile <- new File(path).check 
    deletedFile <- foundFile.remove 
} yield deletedFile 

res11: Option[java.io.File] = None 

Ama sadece bir dosyayı silmek istiyorsanız o herhangi bir gerçek avantajları olmadan çok ayrıntılı var. Dahası, fileTemp.exists kontrolünün hiçbir anlamı yoktur ve aslında güvenilir değildir (@Eduardo'nun işaret ettiği gibi). Yani, hatta Scala bildiğim en iyi yolu FileUtils.deleteQuietly geçerli:

FileUtils.deleteQuietly(new File(path)) 

Hatta

new File(path).delete() 

Bu varolmayan dosya için bir istisna olmayacaktır - sadece false dönün.

şeyi gerçekten daha Scala yönlü istiyorsanız - örneğin rapture.io bakmak:

val file = uri"file:///home/work/garbage" 
    file.delete() 

Ya scala-io. diğer bilgiler: How to do File creation and manipulation in functional style?

Not; Ancak IO-monads zaman uyumsuz işlemler gerektiren (benim durumumda Bazı/Yok aksine), (kediler/scalaz olmadan) çok saf kod gibi görünecektir yararlı olabilir: gerçek dünyada, Tabii

implicit class FileMonads(f: File) { 
    def check = Future{ f.exists } //returns "Future" monad 
    def remove = Future{ f.remove } //returns "Future" monad 
} 

for { 
    exists <- new File(path).check 
    _ <- if (exists) foundFile.remove else Future.unit 
} 

, FS2-io: https://lunatech.com/blog/WCl5OikAAIrvQCoc/functional-io-with-fs2-streams

+0

gibi bazı NIO sarmalayıcılarını kullanmak en iyisidir, ancak ilk seçenek olarak, dosyanın var olduğunu doğrulamak ve silme ifadesi arasında başka bir işlem tarafından silinmesi küçük bir olasılıktır. – Eduardo

+0

@Eduardo ve 'Yok' var, o zaman bu doğru :) – dk14

+0

@dk o zaman neden kontrol edin? – Eduardo