Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 向州政府拉皮条_Scala - Fatal编程技术网

Scala 向州政府拉皮条

Scala 向州政府拉皮条,scala,Scala,我希望能够将皮条客我的库模式应用于状态,而不是行为。具体来说,如果在隐式定义中定义一个var,设置它,然后尝试读取它,那么状态将丢失。我列举了一个人为的例子: class Planet(val name: String) object SolarSystem { val Mercury = new Planet("Mercury") val Venus = new Planet("Venus") val Earth = new Planet("Earth") val Mars

我希望能够将皮条客我的库模式应用于状态,而不是行为。具体来说,如果在隐式定义中定义一个var,设置它,然后尝试读取它,那么状态将丢失。我列举了一个人为的例子:

class Planet(val name: String)

object SolarSystem {
  val Mercury = new Planet("Mercury")
  val Venus = new Planet("Venus")
  val Earth = new Planet("Earth")
  val Mars = new Planet("Mars")
  val Jupiter = new Planet("Jupiter")
  val Saturn = new Planet("Saturn")
  val Uranus = new Planet("Uranus")
  val Neptune = new Planet("Neptune")
  val Pluto = new Planet("Pluto")
}

object Pimper {
  implicit def pimpPlanet(planet: Planet) = {
    new {
      var distanceFromSun: Int = 0
    }
  }

  import SolarSystem._

  Jupiter.distanceFromSun = 5 // AU
}

object Main {
  def main(args: Array[String]) {
    import SolarSystem._
    import Pimper._

    println(Jupiter.distanceFromSun)
  }
}
当然,这将打印0,但我希望它打印5。我考虑过一些解决方案,包括扩展SolarSystem和覆盖Jupiter,或者在外部有一个由getter&setter填充/读取的地图


我是Scala的新手,我希望有一种更优雅的方式来做类似的事情。同样是的,冥王星是一颗行星:)

让它成为一颗
val
并在你拥有的行星上进行模式匹配:

implicit def pimpPlanet(planet: Planet) = {
  new {
    var distanceFromSun: Int = planet match {
      case Planet("Earth") => 1
      case Planet("Jupiter") => 5
    }
  }
}

等等。

将突变与皮条客“我的库”模式结合使用感觉不对。有点像宣布冥王星不是行星。这是不对的。
object Pimper { 

  var planets = Map.empty[Planet, EnhancedPlanet]
  class EnhancedPlanet(var distance: Int)

  implicit def pimpPlanet(planet: Planet) = planets.get(planet).getOrElse {
    planets += planet -> new EnhancedPlanet(0)
    planets(planet)
  }

}

object Main {
  def main(args: Array[String]) {
    import SolarSystem._
    import Pimper._

    println(Jupiter.distance) //0
    Jupiter.distance = 5
    println(Jupiter.distance) //5
  }
}