首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用uJson库理解这个可变的递归函数

使用uJson库理解这个可变的递归函数
EN

Stack Overflow用户
提问于 2020-06-18 05:16:36
回答 1查看 45关注 0票数 0

我正在尝试使用ujson library实现一个插入函数。

这是我的尝试:

代码语言:javascript
复制
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)
}

但是,这给我的输出是不变的:

代码语言:javascript
复制
[{"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]}}}]

既然值类型是可变的,为什么不改变并使用json值对象r的值v来更新键k呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-18 16:36:15

每次调用r时,您都会重新创建Value,因此,您对它所做的每一次更改都会被忽略。

当您调用println(r)时,您将创建一个副本。

然后,您使用insert(r, "b", transform(None).to(Value))创建一个单独的副本,对其进行修改并将其删除。

然后使用另一个println(r)创建第三个副本。

如果您想引用同一对象,请使用val而不是def

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62438502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档