2016-04-11 2 views
0

Я пытаюсь записать данную строку в новый файл в SCALA.Напишите строку в новый файл в Scala

я импортировал

java.io._ 
java.nio._ 

Это мой код:

implicit class PathImplicits(p: Path) { 
    def write(str:String, file:String):Path = Paths.get(file) 
    p.write(str,file) 
    } 

Однако компиляции говорит, что не признает переменную 'файл'.

+0

Если у вас возникли проблемы с сбоем компиляции, пожалуйста, включите полный вывод. – Daenyth

ответ

0

Прежде всего, вам не хватает пары фигурных скобок вокруг вашей функции. Я думаю, вы хотели, чтобы она выглядела так:

def write(str:String, file:String):Path = { 
    Paths.get(file) 
    p.write(str,file) 
} 

Похоже, потому str и file являются параметры функции, и вы пытаетесь использовать их вне его (тело функции без скобок является только одно заявление).

Теперь, как я «исправил» это для вас, все еще не имеет особого смысла. Во-первых, Paths.get(file) ничего не делает, он просто возвращает объект Path, который вы не присваиваете никому, поэтому этот вызов не имеет никакого эффекта. Во-вторых, Path не имеет метода, называемого write, поэтому вторая строка не будет работать. Возможно, вы намеревались в конечном итоге вызвать PathImplicits.write, но это не сработает (вы должны быть вне этого класса), и это хорошо, потому что вы на самом деле внутри этой функции, и, если эта линия снова вызвала его, вы попали бы в бесконечную рекурсию.

Давайте разложим вашу проблему на две части. Во-первых, давайте забудем о имплицитах и ​​других причудливых вещах и просто выясним, как писать строку в файл. Существует много разных способов сделать это. Вот один, например:

def writeToFile(file: File, str: String): Unit = { 
    val writer = new FileWriter(file) 
    try { writer.append(str).append("\n") } 
    finally { writer.close }   
} 

Теперь, если вы хотите, чтобы заставить его работать с Path неявно, вам нужно что-то вроде этого:

object PathImplicits { 
    implicit class RichPath(p: Path) extends AnyVal { 
     def write(str: String) = writeToFile(p.toFile, str) 
    } 
} 

Вот так. Теперь вы должны написать что-то вроде этого:

import PathImplicits._ 
Paths.get("/some/path/to/file.txt").write("Foo!")  
+0

Все хорошо, но почему 'RichPath' расширяет' AnyVal'? –

+1

@TzachZohar - это трюк, который вы можете сделать, чтобы избежать создания экземпляров неявных классов: если он не расширил 'AnyVal', то' path.write ("foo") 'приведет к созданию промежуточного объекта для' RichPath' перед вызовом 'пишите 'и отбрасывая. С помощью тэга 'extends AnyVal' этого избыточного экземпляра исключается, так же как' 3.toString' не создает экземпляр 'Integer' – Dima

+0

отличный трюк, спасибо @Dima! –

Смежные вопросы