Ваш код не компилируется, потому что вы пытаетесь повторно назначить val
. A val
может быть инициализирован только один раз и не может быть повторно назначен. Кроме того, ваш код не очень похож на Scala, потому что вы используете null
и return
.
Для значений, которые потенциально могут быть пустыми, вы должны использовать Option
вместо null
. null
действительно существует только для взаимодействия с Java, и его следует избегать в чистом коде Scala.
Вам не нужно использовать ключевое слово return
; последнее выражение, которое выполняется в методе, автоматически возвращает возвращаемое значение метода.
Это было бы лучше, реализация (по-прежнему с помощью null
- вам необходимо изменить свой Node
класс, чтобы избавиться от этого):
def inorder(node: Node): String =
if (node == null) ""
else inorder(node.leftChild) + node.label + inorder(node.rightChild)
При использовании Option
:
case class Node(leftChild: Option[Node], label: String, rightChild: Option[Node])
def inorder(node: Option[Node]): String =
node map { n => inorder(n.leftChild) + n.label + inorder(n.rightChild) } getOrElse ""
Пример использование:
scala> val tree = Node(Some(Node(None, "left", None)), "root", Some(Node(None, "right", None)))
tree: Node = Node(Some(Node(None,left,None)),root,Some(Node(None,right,None)))
scala> inorder(Some(tree))
res2: String = leftrootright
val написан там по ошибке , Это var в моем коде. Поэтому я отредактировал это. Спасибо за помощь. И так замечательно, что вы предоставили дополнительные советы о Scala. –
Кроме того, здесь вы использовали свойство конкатенации строки в наших интересах. Можно ли написать такой код, если кто-то должен вернуть что-то еще, скажем, список строк (скажем, в какой-то другой проблеме?) –
Да, конечно, вы можете объединить списки так же, как вы можете объединить строки. Это было бы почти то же самое. – Jesper