Понимание этой изменяемой рекурсивной функции с использованием библиотеки u Json - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь реализовать функцию вставки с использованием библиотеки u json :

Вот моя попытка:

import ujson.{Obj, Value}
import upickle.default._

object Example extends App {
  def r = transform(
    List(Map(
      "a" -> Map("b" -> Obj("c" -> List(1,2,3), "d" -> List(2,4,6))), 
      "e" -> Map("f" -> Obj("g" -> List(1,2,3)))))
  ).to(Value)

  def insert(j: ujson.Value, k: String, v: ujson.Value): Unit = j match {
    case a: ujson.Arr => a.arr.foreach(e => insert(e, k, v))
    case o: ujson.Obj =>
    if (o.obj.keySet contains k)  o.obj(k) = v
    else o.obj.values.foreach(e => insert(e, k, v))
    case _ => Nil
  }

  println(r)
  insert(r, "b", transform(None).to(Value))
  println(r)
}

Однако это дает мне вывод, который не изменился:

[{"a":{"b":{"c":[1,2,3],"d":[2,4,6]}},"e":{"f":{"g":[1,2,3]}}}]
[{"a":{"b":{"c":[1,2,3],"d":[2,4,6]}},"e":{"f":{"g":[1,2,3]}}}]

Учитывая, что тип значения является изменяемым, почему он не изменяет и не обновляет ключ k со значением v для json объекта значения r?

1 Ответ

1 голос
/ 18 июня 2020

Вы создаете Value заново каждый раз, когда вызываете r, поэтому все изменения, которые вы в него вносите, отклоняются.

Вы создаете одну копию, когда вызываете println(r).

Затем вы создаете отдельную копию с insert(r, "b", transform(None).to(Value)), изменяете ее и отклоняете.

Затем вы создаете третью копию с другим println(r).

Если вы хотите сослаться на тот же объект используйте val вместо def.

...