Не удалось найти определенный объект, прежде чем использовать его в регистре соответствия в масштабе

#scala #pattern-matching

#scala #сопоставление с образцом

Вопрос:

 sealed trait Json {
  def toStringT: String=
    this match {
      case JsTrue => "true"
      case JsFalse => "false"
      case JsNull => "null"
      case JsString(str) => str
      case JsNumber(num) => num.toString
      case JsArrayEmpty => "[]"
      case JsArrayT(head, tial) => s"[${head.toStringT}, ${tial.toStringT}]"
      case JsObjectEmpty => "{}"
      case JsObjectT(pair, tail) => s"${pair.key}: ${pair.value.toStringT} n ${tail.toStringT}"
    }
}


sealed trait JsArray extends Json
//jsarray
case object JsArrayEmpty extends JsArray
final case class JsArrayT(head:Json, tail:JsArray) extends JsArray

final case class JsString(str:String) extends Json
final case class JsNumber(num:Double) extends Json
case object JsTrue extends Json
case object JsFalse extends Json
case object JsNull extends Json


sealed trait JsObject extends Json
// jsobject
case object JsObjectEmpty extends JsObject
final case class JsPair(key:String, value:Json) {
  def toStringT :String =
    key   ":"   value.toStringT
}
final case class JsObjectT(pair:JsPair, tail:JsObject) extends JsObject

  

компилятор жалуется:

C:UsersnameIdeaProjectsHelloWorldsrcHell5.sc:4:12
не найдено:
значение JsTrue case JsTrue => «true»

Я не мог переместить определение JsTrue перед json определением, потому что оно использует определение json

Комментарии:

1. Не удается воспроизвести scastie.scala-lang.org/YkDF124FQgGCr8fHlZs37Q

2. Это связано с тем, как вы компилируете / запускаете свой код. Попробуйте заменить Scala script *.sc на обычный *.scala .

3. Хорошо, похоже, что его нельзя запустить на рабочем листе

4. это потому, что рабочий лист работает как интерпретатор и компилирует код построчно

Ответ №1:

Поскольку вы используете sc скрипт, а не полный файл scala, операторы вычисляются один за другим. В обычном файле scala это будет просто работать.