不能匹配scala中的字符,期望单位类型

时间:2017-05-03 07:19:19

标签: scala

这是我的代码:

val foo = "\\foo"
var escaped = ""
foo.foreach(c => {
  escaped += c match {
    case '_' => "\\_"
    case '\\' => "\\textbackslash{}"
    case '~' => "\\textasciitilde{}"
    case '^' => "\\textasciicircum{}"
    case '&' => "\\&"
    case '%' => "\\%"
    case '#' => "\\#"
    case '{' => "\\{"
    case '}' => "\\}"
    case ch => ch
  }
})

IntelliJ告诉我模式类型与预期类型不兼容,找到:Char,required:Unit 。为什么会这样? c显然是Char,而非单位。

2 个答案:

答案 0 :(得分:2)

嗯......问题foreach collection typeList[A]有签名,

foreach(func: A => Unit): Unit

这意味着foreach想要一个A => Unit类型的函数作为参数。

在这种情况下,您有一个String,此处foreach需要一个Char => Unit类型的函数作为参数。

但看看你的功能正面......

c => {
  escaped += c match {
    case '_' => ...
    ...
  }
}

你实际拥有的是,

c => {
  (escaped += c) match {
    case '_' => ...
    ...
  }
}

(escaped += c)Unit。所以要解决这个问题,你必须使用的是正确的括号,

c => {
  escaped += (c match {
    case '_' => ...
    ...
  })
}

另外......你应该避免使用这种方法来构建该字符串。您可以使用map创建字符串,而不是在foreach

中附加到字符串
val foo = "\\foo"
val escaped = foo.map(c => c match {
  case '_' => "\\_"
  case '\\' => "\\textbackslash{}"
  case '~' => "\\textasciitilde{}"
  case '^' => "\\textasciicircum{}"
  case '&' => "\\&"
  case '%' => "\\%"
  case '#' => "\\#"
  case '{' => "\\{"
  case '}' => "\\}"
  case ch => "" + ch
}).mkString

答案 1 :(得分:2)

问题是您要将escaped + char'_'匹配等。match内的()然后与另一个变量联接。

val foo = "\\foo"
var escaped = ""

foo.foreach((char : Char) => {
  escaped = escaped + (char match {
    case '_' => "\\_"
    case '\\' => "\\textbackslash{}"
    case '~' => "\\textasciitilde{}"
    case '^' => "\\textasciicircum{}"
    case '&' => "\\&"
    case '%' => "\\%"
    case '#' => "\\#"
    case '{' => "\\{"
    case '}' => "\\}"
    case ch => ch
  })
})

println(escaped) //prints \textbackslash{}foo