当前位置: 首页 > 知识库问答 >
问题:

如何使Scala枚举在不修改原始枚举的情况下实现Trait?

纪枫
2023-03-14

我是第一次玩Scala,所以请耐心等待。还使用 tapir 来声明 API,我在为枚举提供架构时遇到问题。

我定义了一堆枚举,它们是我的域模型的一部分,并扩展了Scala的枚举。例如,这是其中之一:

object Status extends Enumeration with JsonEnumeration {
    val Active, Completed, Archived, Deleted = Value
}

并且还有许多使用它们的案例类。例如,Order 使用我们之前定义的枚举,例如:

case class Order(
    id: String,
    name: Option[String],
    status: Status.Value,
)

我想让这个枚举实现一个添加隐式但又不修改原始状态枚举的特征(我不想将状态枚举 - 以及所有其他枚举 - 耦合到这个特征)。

特征如下所示:

import sttp.tapir.{Schema, Validator}

trait TapirEnumeration { e: Enumeration =>
  implicit def schemaForEnum: Schema[e.Value] =
    Schema.string.validate(Validator.enumeration(e.values.toList, v => Option(v)))
}

我想以某种方式修改 Order 对象,以便 Status 枚举现在是一个 TapirStatus 枚举(或类似的东西),它扩展了原始 Status 和 TapirEnumeration,但我认为这是不可行的,因为 Status 最初被定义为一个配套对象。

理想情况下,我希望作为API响应公开的所有枚举都将实现< code > taperinumeration 特征,同时仍然扩展它们已经扩展的内容。

我能做些什么来实现这一点?当然,创建一个实现trait的新enum并不枯燥,所以它不是一个选项。

共有1个答案

公沈浪
2023-03-14

为什么首先需要在枚举本身中定义隐式?让它有自己的定义。

import scala.language.implicitConversions
object EnumImplicits {
    implicit def schema[E <: Enumeration](e: E): Schema[e.Value] = ???
}

然后,无论您在哪里需要访问该隐式内容,只需通过导入EnumImplicits._使其可用

这里有一个例子

 类似资料:
  • 我试图在Enum上做一点反向工程。 接口内的枚举实现-Java

  • 问题内容: 这不是卡住我的问题,而是我正在寻找一种编写代码的整洁方法。 本质上,我正在编写一个事件驱动的应用程序。用户触发一个事件,该事件被发送到适当的对象,然后这些对象处理事件。现在,我正在编写偶数处理程序方法,并且希望使用switch语句确定如何处理事件。现在,在我研究通用结构时,事件类非常简单: 然后,在另一堂课中,我会看到类似以下内容的内容: 我会 喜欢 做的就是这样的事情(尽管我当然会坚

  • 问题内容: 例如,我该怎么做: 结果示例: 问题答案: 迅捷4.2+ 从Swift 4.2(使用Xcode 10)开始,只需添加协议一致性即可从中受益。要添加此协议一致性,您只需要在某处写: 如果枚举是您自己的,则可以直接在声明中指定一致性: 然后,以下代码将打印所有可能的值: 与早期Swift版本(3.x和4.x)的兼容性 如果您需要支持Swift 3.x或4.0,则可以通过添加以下代码来模仿S

  • springdoc-openapi项目中存在关闭问题#1101,该问题请求允许影响枚举序列化。然而,这个问题已经结束,因为没有为它提交公关。 如何使枚举列表匹配RESTendpoint接受/返回的实际JSON类型,而不是值? 解决这个问题的第一个想法是使用来自Swagger Core的注释。然而,不管是出于bug还是出于设计,这都是对值列表的添加,而不是替换: Swagger URL:

  • 我不得不说我不理解Scala枚举类。我可以从文档中复制粘贴示例,但我不知道是怎么回事。 什么是?为什么我必须写这个? 为什么?这到底是什么意思? 为什么必须导入对象?并且, 当我编写时,为什么要键入,而不是键入?

  • 问题内容: 我想知道在Java中是否可以嵌套枚举。 在这里,我想做的是: 拥有一个由CAT和DOG组成的物种,将允许我访问可用CAT和DOG品种的子枚举。例如,我希望能够测试是否装有CAT或DOG,以及动物是否是PERSAN CAT或PITBULL狗。CAT和DOG品种必须是不同的枚举,即CatBreeds枚举和DogBreeds枚举。 这是我要使用的访问模式的示例: 种类: 物种 种狗 品种: