如何编写为所有枚举值的子集定义的函数?

问题描述 投票:0回答:1

假设我有枚举

A

object A extends Enumeration { type A = Int; val A1 = 1; val A2 = 2; val A3 = 3 }

另外,我有一个仅为

A1
A2
定义的函数,但不为
A3
定义。

def foo(a: A): Int = a match { 
  case A.A1 => 1 // do something 
  case A.A2 => 2 // do something else 
  case A.A3 => throw new UnsupportedOperationException() 
}

现在我想得到

foo(A.A3)
的编译错误。 在伪代码中,我像这样定义
foo

def foo(a: A1 | A2): Int = ???

您建议如何编写

foo
来防止使用
A.A3
调用它?

scala enumeration
1个回答
1
投票

给出的伪代码是正确的;支持的类型需要位于

foo
的类型签名中,不支持的类型则不需要。

// Scala 3

object A extends Enumeration {
  type A = Int
  val A1 = 1
  val A2 = 2
  val A3 = 3
}

def foo(a: A.A1.type | A.A2.type): Int = 1

@main
def main(): Unit = {
  foo(A.A1)
  foo(A.A3)
}

编译错误:

Found:    (A.A3 : Int)
Required: (A.A1 : Int) | (A.A2 : Int)
  foo(A.A3)

如果你想在 scala 2 中执行此操作,你可能可以找到一些与幻像类型一起使用的东西。

© www.soinside.com 2019 - 2024. All rights reserved.