2013-03-23 15 views
5

Scala's SeqLike implementuje metodę contains. Jak mogę w prosty sposób zrealizować funkcję containsAny?Idiomatyczny sposób implementowania containsAny dla Scala SeqLike

Powiedzmy, że chcesz się dowiedzieć, czy ciąg string zawiera żadnej z czarnej liście znaków w blacklist:

val blacklist = List("(", ")", "[", "]", "{", "}", "<", ">") 
string containsAny blacklist 

jaki jest najlepszy sposób, aby realizować drugą linię czysto?

Moja wersja tej pory wygląda następująco:

(blacklist.view map string.contains) contains true 

Odpowiedz

10

Najprościej jest, aby czarnej listy zestawu.

val blacklist = "()[]{}<>".toSet 

Teraz możesz użyć exists, aby sprawdzić, czy którykolwiek z tych znaków istnieje w twoim ciągu. Ponieważ Set[T] rozszerza się o T => Boolean, można po prostu użyć zestawu bezpośrednio, zamiast pisać wyraźny warunek.

scala> "I like fish (but not herring)" exists blacklist 
res1: Boolean = true 

scala> "I like fish, especially salmon!" exists blacklist 
res2: Boolean = false 

(Uwaga: należy uważać, o różnicy między smyczki, "I am a string" i znaków. 'c' Ciąg jedna postać jest ciągiem znaków, a nie charakter.)

Powiązane problemy