Scala-код во время компиляции приводит к ошибке: для информации о рекурсивном значении необходим тип - PullRequest
0 голосов
/ 28 декабря 2018

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

def extract_FileContent = udf((file_contents: String) => {

  val info = (file_contents.replace("\",\"", "     ")
    .replace("\"", "")
    .replaceAll("    ", "|")
    .replaceAll(" : \r\n", " : empty\r\n")
    .replaceAll("\r\n", "|")
    .replaceAll(" : ", "|")
    .replaceAll(": ", "|")
    .split("\\|")
    .map(x => x.trim.replaceAll(" -", ""))
    .filterNot(s => s == ""))
  // type info = Array[String]

  if (info.toList(42) == "Start Archive Record") {
    val info = info.take(42) ++ info.drop(50) \\ recursive error here
    }
}

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Вы определяете info дважды.Определение внутри оператора if скрывает первое определение - в основном, info слева и справа относятся к той же (новой) переменной, а не к той, которую вы определили ранее, поэтому она считает, что она рекурсивная,

Решение?Просто дайте ему другое имя ... или, в этом случае, вам вообще не нужно его называть:

val info = file_contents.replace ...
 ...
if (info(42) == "Start Archive Record") { // don't do `.toList` here, it's not only redundant, but actually makes things worse
  info.take(42) ++ info.drop(50)
} else info
0 голосов
/ 28 декабря 2018

Привет @ aaron02, быстро проверив ваш код, есть пара неверных вещей, одна из которых вы заявляете.

val ключевое слово определяет константу, и ваш кодпытаясь переопределить константу "info", основываясь на этом условии ... если вы этого хотите, вам, вероятно, следует использовать переменную.

С другой стороны, в пределах, если вы определяете константу на основе самой ее... это рекурсивность, для которой вы видите ошибку ... компилятор помогает вам с выводом типа, но в этом случае он требует, чтобы вы указали тип.

Следующее будет работать для изоляции, но вместев вашем коде компилятор расскажет вам о вашем коде, пытающемся переназначить значение.

val info: Array[String] = info.take(42) ++ info.drop(50)

, надеюсь, это немного осветит вашу кодировку.

update:

Этот фрагмент может быть близок к тому, что вы хотите:

def extract_FileContent = (file_contents: String) => {

  var info = file_contents.replace("\",\"", "     ")
    .replace("\"", "")
    .replaceAll("    ", "|")
    .replaceAll(" : \r\n", " : empty\r\n")
    .replaceAll("\r\n", "|")
    .replaceAll(" : ", "|")
    .replaceAll(": ", "|")
    .split("\\|")
    .map(x => x.trim.replaceAll(" -", ""))
    .filterNot(s => s == "")

  if (info.toList(42) == "Start Archive Record") {
    info = info.take(42) ++ info.drop(50) // recursive error here
  }
  info // This as last statement will mean we return the Array[String], otherwise we were returning a Unit (side effect only)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...