使用 uJson 库理解这个可变递归函数
Understanding this Mutable Recursive Function using the uJson library
我正在尝试使用 ujson library:
实现插入功能
这是我的尝试:
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]}}}]
鉴于 Value 类型是可变的,为什么这不会改变和更新键 k,值为 json 值对象 r 的值 v?
您每次调用 r
时都会重新创建 Value
,因此,您对它所做的所有更改都会被取消。
您在调用 println(r)
时创建了一个副本。
然后用 insert(r, "b", transform(None).to(Value))
创建一个单独的副本,对其进行变异并关闭。
那么你正在用另一个 println(r)
创建第三个副本。
如果要引用同一对象,请使用 val
而不是 def
。
我正在尝试使用 ujson library:
实现插入功能这是我的尝试:
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]}}}]
鉴于 Value 类型是可变的,为什么这不会改变和更新键 k,值为 json 值对象 r 的值 v?
您每次调用 r
时都会重新创建 Value
,因此,您对它所做的所有更改都会被取消。
您在调用 println(r)
时创建了一个副本。
然后用 insert(r, "b", transform(None).to(Value))
创建一个单独的副本,对其进行变异并关闭。
那么你正在用另一个 println(r)
创建第三个副本。
如果要引用同一对象,请使用 val
而不是 def
。