2012-03-19 32 views
27

私は、次のしている:スカラ - ケースマッチ部分文字列

var serv = "chat" 

serv match { 

    case "chat" => Chat_Server ! Relay_Message(serv) 
    case _ => null 

} 

問題は時々私もそう、SERVの文字列の末尾に追加のparamを渡すことです:

var serv = "chat.message" 

ですそれはまだChat_Serverに送信されるように文字列の一部に一致する方法がありますか?感謝任意の助け

おかげで、:)

+0

次のように、解決策があります。しかし、おそらく 'serv'は単純な' String'だけでなく、より構造化された価値を求めていますか? –

+2

'case class'はこれに完璧です! – Kyle

+4

Scalaでは 'null'の使用は避けるべきです。代わりに 'Option'を使用してください。 'null'はJavaとの相互運用性のためだけに存在します。 – Jesper

答えて

41

使用正規表現「チャット」で始まることを確認するためにガードを使用します。 )

val Pattern = "(chat.*)".r 

serv match { 
    case Pattern(chat) => "It's a chat" 
    case _ => "Something else" 
} 

そして、正規表現あなたも簡単に分割することができ、パラメータとベース文字列と

val Pattern = "(chat)(.*)".r 

serv match { 
    case Pattern(chat,param) => "It's a %s with a %s".format(chat,param) 
    case _ => "Something else" 
} 
+2

では* guard *と呼ばれていますが、pattenrのマッチングの "chat"変数は明らかに役に立たず、 'Pattern(_)'と置き換えることができます。 – Nicolas

+1

@ニコラス右。私はopバージョン 'chat'がサーバーへのメッセージとして使用されるため、それを無視していません。 –

+0

あなたの解決策では、パターンが一致した場合、 'chat'変数は常に' 'chat ''と等しいことに注意してください。 (だからといって私は役に立たないと書いた) – Nicolas

43

変数にバインドパターンマッチングを持っており、変数が

// msg is bound with the variable serv 
serv match { 
    case msg if msg.startsWith("chat") => Chat_Server ! Relay_Message(msg) 
    case _ => null 
} 
+2

あなたのケースでは、最初のケースの式 –

関連する問題