【问题标题】:Pimp my library with state用状态拉皮条我的图书馆
【发布时间】:2012-04-24 11:21:00
【问题描述】:

我希望能够将 pimp-my-library 模式应用于状态,而不是行为。具体来说,如果你在隐式 def 中定义了一个 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 填充/读取的地图& 二传手。

我对 Scala 还是很陌生,我希望有一种更优雅的方式来做这样的事情。也是的,冥王星是一颗行星:)

【问题讨论】:

  • 对 pimp-my-library 模式使用突变感觉不对。有点像宣布冥王星不是行星。这是不对的。

标签: scala


【解决方案1】:
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
  }
}

【讨论】:

    【解决方案2】:

    将其设为val 并在您拥有的星球上进行模式匹配:

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

    等等

    【讨论】:

      猜你喜欢
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 2022-07-20
      • 1970-01-01
      • 2018-06-18
      相关资源
      最近更新 更多