我要解決的問題是檢查串列的第一個元素(如果有)是否屬于某個列舉型別。如下:
enum Color(val rgb: Int):
case Red extends Color(0xFF0000)
case Green extends Color(0x00FF00)
case Blue extends Color(0x0000FF)
case CustomColor(override val rgb: Int) extends Color(rgb)
def isExpected(expect: Color, colors: List[Color]): Either[Error, (Color, List[Color])] =
colors.headOption match {
case Some(head) => {
if (head == expect) { Right(expect, tokens.tail) }
else {
expect match {
case Color.Red => Left(Error.ExpectRed)
case Color.Green => Left(Error.ExpectGreen)
case Color.Blue => Left(Error.ExpectBlue)
}
}
}
case _ => {
expect match {
case Color.Red => Left(Error.ExpectRed)
case Color.Green => Left(Error.ExpectGreen)
case Color.Blue => Left(Error.ExpectBlue)
}
}
}
- 有沒有辦法重構上面代碼片段中的重復代碼?
- 即使在第一種情況下,是否可以檢查 headOption 的型別是否與期望引數匹配?
uj5u.com熱心網友回復:
這個怎么樣:
scala> enum Color(val rgb: Int):
| case Red extends Color(0xFF0000)
| case Green extends Color(0x00FF00)
| case Blue extends Color(0x0000FF)
| case CustomColor(override val rgb: Int) extends Color(rgb)
|
| enum Error:
| case ExpectRed
| case ExpectGreen
| case ExpectBlue
| case ExpectCustom
|
|
| def isExpected(expect: Color, colors: List[Color]): Either[Error, (Color, List[Color])] = colors match
| case `expect` :: tail => Right(expect, tail)
| case _ =>
| expect match
| case c: Color.CustomColor => Left(Error.ExpectCustom)
| case rgb => Left(Error.valueOf(s"Expect$rgb"))
|
// defined class Color
// defined class Error
def isExpected
(expect: Color, colors: List[Color]): Either[Error, (Color, List[Color])]
scala> val colors = List(Color.Red, Color.Green, Color.CustomColor(123))
val colors: List[Color] = List(Red, Green, CustomColor(123))
scala> isExpected(Color.Green, colors)
val res0: Either[Error, (Color, List[Color])] = Left(ExpectGreen)
scala> isExpected(Color.Red, colors)
val res1: Either[Error, (Color, List[Color])] = Right((Red,List(Green, CustomColor(123))))
scala> isExpected(Color.CustomColor(123), colors)
val res2: Either[Error, (Color, List[Color])] = Left(ExpectCustom)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/474433.html
