gpt4 book ai didi

scala - 用状态来修饰我的图书馆

转载 作者:行者123 更新时间:2023-12-02 20:21:26 24 4
gpt4 key购买 nike

我希望能够将 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 填充/读取的 map & setter 。

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

最佳答案

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
}
}

关于scala - 用状态来修饰我的图书馆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10290996/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com