Scala:模式匹配+字符串连接

时间:2013-11-16 07:37:52

标签: scala pattern-matching concatenation

我有一个简单的递归函数将布尔值列表转换为字符串:

def boolsToString(lst: List[Boolean]): String = lst match {
    case Nil => ""
    case x::xs => x match {
      case false => "0" + boolsToString(xs)
      case true => "1" + boolsToString(xs)
    }
  }

这有效,但我不喜欢重复boolsToString。我只想做一次字符串连接(在案例之后):

  def boolsToString2(lst: List[Boolean]): String = lst match {
    case Nil => ""
    case x::xs => x match {
      case false => "0"
      case true => "1"
    } + boolsToString2(xs)
  }

但Scala编译器拒绝了这一点:“';'预期但发现了标识符。“

在案例之后,是否还有另一种方法可以进行一次字符串连接?

3 个答案:

答案 0 :(得分:4)

无需重新发明轮子。 Iterables已经有一种方法将项目连接成一个名为mkString的字符串:

def boolsToString(lst: List[Boolean]) =
  lst.map(if(_) "1" else "0").mkString("")

答案 1 :(得分:3)

怎么样:

def boolsToString(lst: List[Boolean]): String = lst match {
    case Nil => ""
    case x::xs => (if (x) "1" else "0") + boolsToString(xs)
  }

答案 2 :(得分:1)

我明白了;让原始版本工作的诀窍是在案例正文周围添加额外的括号:

def boolsToString2(lst: List[Boolean]): String = lst match {
    case Nil => ""
    case x::xs => (x match {
      case false => "0"
      case true => "1"
    }) + boolsToString2(xs)
}

但@Shadowlands的回答非常好: - )