模式匹配没有冗余的数组

时间:2013-06-24 15:58:29

标签: scala pattern-matching

谁能告诉我如何重写这段代码以避免冗余部分?

   val lineSplit = line.split(" ")
      lineSplit match {
        case Array(cls @ TaggedString(), prop @ TaggedString(), value @ Literal(), ".") => {processProperty(prop);processLiteral(value)}
        case Array(cls @ TaggedString(), prop @ TaggedString(), value @ LiteralwithSchema(), ".") => {processProperty(prop);processExtendedLiteral(value)}
        case Array(cls @ TaggedString(), prop @ TaggedString(), value @ TaggedString(), ".") => {processProperty(prop);processTag(value)}
        case _ => throw new IllegalArgumentException("unable to identify line format")

      }

您可能已经看到具有提取属性的部分始终相同。 你有什么想法如何充分考虑这部分?

thx for your input,

的Stefan

2 个答案:

答案 0 :(得分:1)

在你的情况下,我只是加倍匹配(虽然也可以编写一个自定义提取器)并避免重复返回一个完成工作的函数:

def badLine() = throw new IllegalArgumentException("unable to identify line format")
lineSplit match {
  case Array(cls @ TaggedString(), prop @ TaggedString(), x, ".") => 
    val processValue = x match {
      case value: Literal() => () => processLiteral(value)
      case value: LiteralwithSchema() ...
      ...
      case _ => badLine()
    }
    processProperty(prop)
    processValue()
  case _ => badLine()
}

答案 1 :(得分:0)

 val lineSplit = line.split(" ")
  lineSplit match {
    case Array(cls @ TaggedString(), prop @ TaggedString(), value @ Literal(), ".") => {processProperty(prop);processValue(value)}
    case _ => throw new IllegalArgumentException("unable to identify line format")
  }

def processValue(x: String): String = {
    x match {
      case Literal() => processLiteral(x)
      case LiteralwithSchema() => processExtendedLiteral(x)
      case TaggedString() => processTag(x)
      case _ => throw new IllegalArgumentException("value has an unknown format!")
    }

我决定将价值处理考虑在一个对我来说更容易的方法中。 现在看代码这个问题感觉有点尴尬现在大声笑。       }