2017-05-03 2 views

答えて

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 typeList[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