这是我的代码:
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,而非单位。
答案 0 :(得分:2)
嗯......问题foreach
collection type
如List[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