Reputation: 3812
I have the following:
serv match {
case "chat" => Chat_Server ! Relay_Message(serv)
case _ => null
}
The problem is that sometimes I also pass an additional param on the end of the serv string, so:
var serv = "chat.message"
Is there a way I can match a part of the string so it still gets sent to Chat_Server?
Thanks for any help, much appreciated :)
Upvotes: 38
Views: 47527
Reputation: 30453
Since Scala 2.13, you can use the s
interpolator in a match
serv match {
case s"chat" => ...
case s"chat.$msg" => doSomething(msg)
...
}
Upvotes: 1
Reputation: 62835
Use regular expressions, make sure you use a sequence wildcard like _*
, e.g.:
val Pattern = "(chat.*)".r
serv match {
case Pattern(_*) => "It's a chat"
case _ => "Something else"
}
And with regexes you can even easily split parameter and base string:
val Pattern = "(chat)(.*)".r
serv match {
case Pattern(chat, param) => "It's a %s with a %s".format(chat, param)
case _ => "Something else"
}
Upvotes: 59
Reputation: 76
In case you want to dismiss any groupings when using regexes, make sure you use a sequence wildcard like _*
(as per Scala's documentation).
From the example above:
val Pattern = "(chat.*)".r
serv match {
case Pattern(_*) => "It's a chat"
case _ => "Something else"
}
Upvotes: 2
Reputation: 22258
Have the pattern matching bind to a variable and use a guard to ensure the variable begins with "chat"
// msg is bound with the variable serv
serv match {
case msg if msg.startsWith("chat") => Chat_Server ! Relay_Message(msg)
case _ => null
}
Upvotes: 55