これを少し分割してみましょう:
case Some(List(Some(msgType:String), Some(channel:String), Some(data:String))) =>
List(Some(msgType:String), Some(channel:String), Some(data:String)).foreach {
したがって、この時点で、Option[String]から何かへの関数を提供する必要があります。これが重要なポイントです。関数をパラメーターとしてに渡す必要がありますforeach。先に進みましょう:
msgType match {
これは関数であるという印象の下で働いているかもしれませんが、そうではありません。ご存知かもしれませんが、念のため、この点を説明させていただきます。関数は引数を取り、他の何かを返します。それはいくつかの方法で宣言できます。
x => f(x) // anonymous function
{ case x => f(x) } // pattern-matching anonymous function
f _ // eta expansion of method f
f(_) // partial function application
_ + 1 // anonymous function with placeholder syntax
上記のいずれでもないことに注意してくださいmsgType match {。
さて、msgTypeここでは最初のケースで一致したものを参照します。これは、の呼び出しごとにまったく同じにforeachなります(これは、、、をmsgType繰り返しchannel処理dataするため、渡された関数を3回呼び出します)。
case "message" | "pmessage" =>
fn(M(channel, data))
そして今、私たちは問題のポイントに到達します。fn(M(channel,data))はに渡される関数であるforeachため、の戻り型はであるfn必要がありますString => ???。fnまたはについての情報を提供しなかったため、M何が問題であるかを評価する方法がありません。
ただし、関数を返すつもりがなくfn、を台無しにした可能性がありforeachます。繰り返しになりますが、あなたはあなたが達成したいことを説明しなかったので、私はそれを達成する方法を説明することができません。
case x => throw new RuntimeException("unhandled message: " + x)
}
}