Прежде всего, вам не хватает пары фигурных скобок вокруг вашей функции. Я думаю, вы хотели, чтобы она выглядела так:
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!")
Если у вас возникли проблемы с сбоем компиляции, пожалуйста, включите полный вывод. – Daenyth