1

クライアントAPIを修正しようとしていますが、ここで問題が発生しています。

case Some(List(Some(msgType:String), Some(channel:String), Some(data:String))) =>
        List(Some(msgType:String), Some(channel:String), Some(data:String)).foreach {
            msgType match {
              case "message" | "pmessage" => 
                fn(M(channel, data))
              case x => throw new RuntimeException("unhandled message: " + x)
            }
        }

コードをコンパイルしようとすると、次のエラーが発生type mismatch; found : Any required: Some[String] => ?します。fn(M(channel, data))

タイプを受け取るようにマッチングを適切に構成するにはどうすればよいですか?

4

2 に答える 2

3

これを少し分割してみましょう:

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)
        }
    }
于 2012-05-28T21:31:39.883 に答える
0

私はします:

myList match {
  case Some(xs @ List(Some(msgType:String), Some(channel:String), Some(data:String))) =>
    xs.foreach {...}
  case _ => {...}
}

よりクリーンな方法が確かに存在する場合でも、それが役立つことを願っています。

于 2012-05-28T20:02:44.230 に答える