加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用Precog配置模式的Scala cake-pattern编译错误

发布时间:2020-12-16 09:53:22 所属栏目:安全 来源:网络整理
导读:从 this问题开始,我现在有以下内容: case class Pet(val name: String)trait ConfigComponent { type Config def config: Config}trait VetModule extends ConfigComponent { type Config : VetModuleConfig def vet: Vet trait Vet { def vaccinate(pet: P
从 this问题开始,我现在有以下内容:

case class Pet(val name: String)

trait ConfigComponent {
  type Config

  def config: Config
}

trait VetModule extends ConfigComponent {
  type Config <: VetModuleConfig

  def vet: Vet

  trait Vet {
    def vaccinate(pet: Pet)
  }

  trait VetModuleConfig {
    def extra: String
  }

}

trait VetModuleImpl extends VetModule {
  override def vet: Vet = VetImpl

  object VetImpl extends Vet {
    def vaccinate(pet: Pet) = println("Vaccinate:" + pet + " " + config.extra)
  }

}

trait AnotherModule extends ConfigComponent {
  type Config <: AnotherConfig

  def getLastName(): String

  trait AnotherConfig {
    val lastName: String
  }

}

trait AnotherModuleImpl extends AnotherModule {
  override def getLastName(): String = config.lastName
}

trait PetStoreModule extends ConfigComponent {
  type Config <: PetStoreConfig

  def petStore: PetStore

  trait PetStore {
    def sell(pet: Pet): Unit
  }

  trait PetStoreConfig {
    val petStoreName: String
  }

}

trait PetStoreModuleImpl extends PetStoreModule {
  self: VetModule with AnotherModule =>
  override def petStore: PetStore = PetstoreImpl

  object PetstoreImpl extends PetStore {
    def sell(pet: Pet) {
      vet.vaccinate(pet)
      println(s"Sold $pet! [Store: ${config.petStoreName},lastName: $getLastName]")
    }
  }
}

class MyApp extends PetStoreModuleImpl with VetModuleImpl with AnotherModuleImpl {

  type Config = PetStoreConfig with AnotherConfig

  override object config extends PetStoreConfig with AnotherConfig {
    val petStoreName = "MyPetStore"
    val lastName = "MyLastName"
  }

  petStore.sell(new Pet("Fido"))
}


object Main {
  def main(args: Array[String]) {
    new MyApp
  }
}

我得到以下编译错误:

value petStoreName is not a member of PetStoreModuleImpl.this.Config
     println(s"Sold $pet! [Store: ${config.petStoreName},lastName: $getLastName]")
                                   ^

这实际上是我一直在努力的错误.有人可以解释它为什么会发生吗?目前,作为一种解决方法,我只是在每个模块实现中显式地转换配置对象.

解决方法

你写的东西应该有用,但不是,因为 this bug.

您可以使用许多变通方法.将Another Config = PetStoreConfig与AnotherConfig一起添加到模块实现中可能比铸造更不愉快.

更新:正如som-snytt在评论和回答中指出的那样,在自我类型的末尾添加PetStoreModuleImpl(关键不是PetStoreModule,如你所料),这是一个更好的解决方案.

作为脚注:正如在SI-7255的评论中所讨论的那样,Dependent Object Types calculus(被设计为“Scala类型系统的新基础”)将解决这个“Scala类型系统中的基本问题”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读