如何在scala中构造无限的不可变树

达内尔·雅伊茨科夫(Daneel Yaitskov)

我正在尝试将Java的代码片段转换为Scala。它是无限的树状结构。

class Node {
    public Node(Map<String, Node> routes) {}    
}

class Factory {
    public Map<String, Node> buildRoutes() {
        Map<String, Node> routes = new HashMap<>();
        asList("one", "two").forEach(key -> routes.put(key, new Node(routes));
        return routes;
    }

运行正常。将上面的片段翻译成Scala之后,我发现Map出现了问题。看起来在Scala中,可变地图和不可变地图不兼容。

因此,我必须在字段Node中使用可变映射类型。对于我来说,这看起来很奇怪,因为我的地图不可变。它在Node中没有更改,Node必须稍微了解其应有的依赖性。

import scala.collection.mutable

case class Node(routes: mutable.Map[String, Node])

object Factory {
   def buildRoutes(): mutable.Map[String, Node] = {
      val routes = new mutable.HashMap[String, Node]
      List("one", "two").foreach(key => routes.put(key, Node(routes)))
      routes
   }
}

我很高兴看到Node.routes是不可变映射的替代解决方案。

安德烈(Andrey Tyukin)

这里没有什么可变的:

class Node(unfold: => Map[String, Node]) {
  def routes: Map[String, Node] = unfold
}

object Factory {
   def buildRoutes: Map[String, Node] = {
      def fix: Map[String, Node] =
        List("one", "two").map(_ -> new Node(fix)).toMap
      fix
   }
}

它构建时不带StackOverflowErrors,并且仍然无限展开:

val rs = Factory.buildRoutes
println(rs("one").routes("one").routes("two").routes("one").routes.keys)

关键是作用域中的函数定义可以递归引用自己。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何创建不可变类的默认构造函数

如何在Java中创建11不可变的HashMap?

如何在Java中创建不可变列表?

如何在Java中创建一个空的不可变Scala映射?

如何在Java中构造不可实例化且不可继承的类

如何在Vaadin中编辑不可变对象列表?

如何在双向关联中实例化不可变类?

Roslyn的发行版如何实现不可变树?

如何在Scala的不可变模型中正确表达引用?

如何在Python中创建不可变列表?

如何在C#中声明不可变的变量(值)?

如何在Scala中制作不可变的2D数组

如何在Scala中实现不可变的IndexedSeq,并由数组支持

如何在Rust中解释对可变类型的不可变引用?

如何在Scala中将不可变Seq的不可变Seq转换为可变Seq的可变Seq?

在采用无限制参数的方法中,如何在Objective-C中构造数组

如何在scala宏中获取类型较高的参数的树

如何在Kotlin中创建不可变对象?

如何在Dart中返回不可变列表?

如何在C#中运行可变数量的并发参数化无限循环类型的线程?

Scala中不可变值的可变字段

关于scala中可变和不可变集合的困惑

如何在构造函数中设置不可见的GUI?

什么是可变类。我们如何在C#中创建一个可变且不可变的类

如何在Scala中声明可变参数抽象函数

Scala如何在类树中替换对象

如何在 Substrate 中拥有不可变的键值映射?

如何在Javascript中使对象不可变

如何在 Scala 中创建不可变的双向链表?