2012-03-19 19 views
27

Tengo el siguiente:Scala - Partido caso cadena parcial

var serv = "chat" 

serv match { 

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

} 

El problema es que a veces también pasa un parámetro adicional en el extremo de la cadena de serv, por lo que:

var serv = "chat.message" 

Es Hay una forma en que puedo hacer coincidir una parte de la cadena para que se envíe a Chat_Server?

Gracias por cualquier ayuda, muy apreciada :)

+0

Como se puede ver a continuación, hay soluciones. Pero tal vez 'serv' quiere ser un valor más estructurado y no solo un simple 'String'? –

+2

¡una 'clase de caso' sería perfecta para esto! – Kyle

+4

El uso de 'null' debe evitarse en Scala; use 'Option' en su lugar. 'null' realmente solo existe para la interoperabilidad con Java. – Jesper

Respuesta

41

Use expresiones regulares;)

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

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

y con expresiones regulares incluso se puede dividir fácilmente los parámetros de base y de cadena:

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

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

en su caso, la variable "chat" en la coincidencia de pattenr es claramente inútil, puede reemplazarla por 'Patrón (_)' – Nicolas

+1

@Nicolas sí, está derecho. No lo he omitido porque en la versión op 'chat' se usaría como un mensaje para el servidor. –

+0

Tenga cuidado, en su solución, la variable 'chat' siempre será igual a' "chat" 'si el patrón coincide. (es por eso que escribí que era inútil) – Nicolas

43

Tener la coincidencia de patrones se unen a una variable y utilizar un protectorpara asegurar la variable comienza con "chat"

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

Se llama * guardia * en la primera expresión de caso –

Cuestiones relacionadas