を期待これは私のコードです。なぜこれが起こるのですか? c
は明らかにユニットではなくCharです。はScalaでの文字と一致しないことができ、ユニットの種類
0
A
答えて
2
問題で、それに追加するmap
を使用することができます。
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
2
うーん...事は、collection type
なList[A]
ようにforeach
は、次のシグネチャを持っていることをforeach
をパラメータとしてタイプA => Unit
の機能を望んでいることを意味し
foreach(func: A => Unit): Unit
です。
この場合、String
があり、ここでforeach
は、タイプがChar => Unit
のファンクションがパラメータとして必要です。あなたが実際にここにある何
しかし、あなたの関数の本体を見て...
c => {
escaped += c match {
case '_' => ...
...
}
}
、
c => {
(escaped += c) match {
case '_' => ...
...
}
}
そして(escaped += c)
はUnit
です。だから、これを解決するためにあなたが使用しているすべての
c => {
escaped += (c match {
case '_' => ...
...
})
}
また...あなたは、その文字列を構築するために、このアプローチを使用しないでください、適切なカッコです。あなたは自分の文字列を作成する代わりに、あなたはなど'_'
には、別の変数とCONCATその後、match
()
の内側を行い、一致しているある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