scala - 使用枚举作为类型参数

标签 scala enumeration

我想写一个这样的方法:

def validate[T <: Enumeration](input: String)(implicit enum: T) : Seq[T]

它将接受一个输入(“foo,bar,baz”)并用逗号分隔它 - 然后与给定的枚举进行比较。 例如,给定这个枚举:

object Letter extends Enumeration {
  type Letter = Value
  val first = Value("A")
  val second = Value("B")
  val third = Value("C")
}

validate[Letter]("A,B,C,D")的预期输出

将是:Seq[Letter](first,second,third) .

我尝试过做这样的事情:

val inputValues = input.split(",").toSeq
for {
  inputValue <- inputValues
  enumValue <- enum.values
  if enumValue.toString == inputValue
} yield enumValue

但是由于类型系统的原因,它无法编译...还有其他方法可以实现吗?

最佳答案

无法使用隐式枚举来做到这一点,但使用显式枚举似乎是可能的:

scala> import scala.util.Try
scala> def validate[T <: Enumeration](input: String,  enum: T):Seq[T#Value]  = {
     | val inputValues = input.split(",").toSeq
     | for (value <- inputValues if Try(enum.withName(value)).isSuccess) yield enum.withName(value) }
validate: [T <: Enumeration](input: String, enum: T)Seq[T#Value]

scala> validate("A,B,D", Letter)
res12: Seq[Letter.Value] = ArrayBuffer(A, B)

关于scala - 使用枚举作为类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24110688/

相关文章:

自定义用户类型(枚举)的 Scala 光滑查询比较给出错误

c# - 并排枚举编码的其他方法?

java - Scala/Java 子目录名称中带有点

scala - 为什么scala使用反射来调用结构类型上的方法?

scala - 如何在 Scala 中测试 future 列表

vb.net - VB.net在共享相似文件名的目录中合并PDF

mongodb - 如何使用 Cashbah MongoDB 连接?

scala - 在一对多中, "where exists"如何在slick中表达?

c# - 为什么枚举 DirectoryEntry 子项在 WinNT 域上只返回 20 个结果? C#

ios - 有没有办法在 swift 中向除一个节点之外的所有创建的节点添加操作?