2012-03-19 12 views
27

mam następujące:Scala - Sprawa mecz częściowy ciąg

var serv = "chat" 

serv match { 

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

} 

Problemem jest to, że czasami także przekazać dodatkowe param na końcu napisu serv, więc:

var serv = "chat.message" 

Czy jaki sposób mogę dopasować część łańcucha, aby nadal był wysyłany do Chat_Server?

Dzięki za wszelką pomoc, mile widziane :)

+0

Jak widać poniżej, istnieją rozwiązania. Ale może 'serv' chce być bardziej uporządkowaną wartością, a nie zwykłym' Stringiem'? –

+2

"klasa przypadku" byłaby idealna do tego! – Kyle

+4

Należy unikać używania 'null' w Scala; zamiast tego użyj 'Option'. 'null' faktycznie istnieje tylko dla współdziałania z Javą. – Jesper

Odpowiedz

41

Wpisz regexes;)

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

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

i z regexes można nawet łatwo podzielone parametrów i podstawa smyczkowych:

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

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

w twoim przypadku zmienna "chat" w dopasowaniu pattenr jest bezużyteczna, możesz ją zastąpić przez 'Pattern (_)' – Nicolas

+1

@Nicolas tak, jesteś dobrze. Nie rezygnowałem z tego, ponieważ w wersji op 'chat' byłby używany jako wiadomość do serwera. –

+0

Uwaga, w twoim rozwiązaniu zmienna 'chat' zawsze będzie równa' 'chat" 'jeśli wzór jest zgodny. (dlatego napisałem, że to było bezużyteczne) – Nicolas

43

Mają wzór pasujący do wiązania zmiennej i użyć straży celu zapewnienia zmiennej zaczyna się od „chat”

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

Jest to tak zwany * guard * w pierwszym przypadku wyrażenie –