2012-03-19 49 views
27

我有以下:Scala的 - 的情況下的匹配部分串

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'? – 2012-03-19 13:00:56

+2

'case class'對於這個來說是完美的! – Kyle 2012-03-19 13:12:44

+4

在Scala中應避免使用'null';改用'Option'來代替。 'null'實際上只存在於與Java的互操作性中。 – Jesper 2012-03-19 13:43:20

回答

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 2012-03-19 13:02:45

+1

@Nicolas yes,you're對。我並沒有忽略它,因爲在操作版本中,「聊天」將用作消息到服務器。 – 2012-03-19 13:04:12

+0

請注意,在您的解決方案中,如果模式匹配,「聊天」變量將始終等於「聊天」。 (這就是爲什麼我寫它是無用的) – Nicolas 2012-03-19 13:16:02

43

具有匹配的綁定到一個變量的模式,並使用後衛確保變量開始「聊天」

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

在你的情況下,第一種情況表達式 – 2012-03-19 13:02:50

相關問題