【问题标题】:Scala forward referencingScala 前向引用
【发布时间】:2017-01-20 09:34:14
【问题描述】:

我是 Scala 新手。我正在制作一个游戏,我有一个角色可以访问的位置列表,类型为Location。我有一个案例类和一个伴随对象来实现这一点。

Location 内部的LinkedLocations 是一个Location 类型的数组,并且可以有任意数量的位置,一个位置可以通向。在这种情况下,房间 1 通向房间 2,反之亦然。

case class Location(name: String, desc: String, linkedLocations: Array[Location]){}

object Location {

  val none: Location = Location("none","none",Array(none))
  val room1: Location = Location("room 1","you are in room 1",Array(room2))
  val room2: Location = Location("room 2","you are in room 2",Array(room1))

  room1.linkedLocations.foreach(location=>println(location.name))
}

我尝试让它们成为惰性 val,但最终导致堆栈溢出。 如何解决这样的前向引用问题? 有没有更好的方法来设计这个?

【问题讨论】:

    标签: scala runtime-error case-class forward-reference


    【解决方案1】:

    这看起来像一个图表示——通常通过将图节点(在本例中为位置)与图边(链接位置)解耦来避免前向引用。您通常可以通过哈希映射查找相邻信息。比如:

    case class Location(name: String, desc: String)
    
    object Location {
    
      val none: Location = Location("none","none")
      val room1: Location = Location("room 1","you are in room 1")
      val room2: Location = Location("room 2","you are in room 2")
    
      val neighborMap: Map[Location, Array[Location]] = Map(
        room1 -> Array(room2),
        room2 -> Array(room1)
      )
    }
    

    然后你可以这样做:

    neighborMap(room1).foreach(location => println(location.name))
    

    【讨论】:

      猜你喜欢
      • 2012-12-23
      • 2013-10-15
      • 2015-10-15
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 2016-01-29
      相关资源
      最近更新 更多