Desen Bağlaçlar ile eşleşen (PatternA VE PatternB)
Scala desen eşleştirme disjunctions destek için bir dil özelliği vardır ('Desen Alternatifleri'):
x match {
case _: String | _: Int =>
case _ =>
}
Ancak, sık sık eğer scrutinee PatternA karşılayan bir eylemi tetiklemek için gerekirvePatternB (bağlaç.)
Bir desen kombinatorik '&&' bu yeteneği ekler. ben yarattım Scala seviyorum gerçekten bana hatırlatan üç küçük çizgiler!
// Splitter to apply two pattern matches on the same scrutinee.
object && {
def unapply[A](a: A) = Some((a, a))
}
// Extractor object matching first character.
object StartsWith {
def unapply(s: String) = s.headOption
}
// Extractor object matching last character.
object EndsWith {
def unapply(s: String) = s.reverse.headOption
}
// Extractor object matching length.
object Length {
def unapply(s: String) = Some(s.length)
}
"foo" match {
case StartsWith('f') && EndsWith('f') => "f.*f"
case StartsWith('f') && EndsWith(e) && Length(3) if "aeiou".contains(e) => "f..[aeiou]"
case _ => "_"
}
Tartışma için puan
- Bunu yapmak için varolan bir yolu var mı?
- Bu yaklaşım ile sorun var mı?
- Bu yaklaşım ile oluşturulmuş olabilir diğer yararlı combinators var mı? (örneğin,
Not
) - Böyle bir kombinatorik standart kütüphane eklenmelidir?
GÜNCELLEME
Sadece derleyici case A && B && C
yorumlaması istendi. Bu telkin operatör kalıpları (Scala Başvuru Bölümü 8.1.9). Ayrıca normal kalıpları (8.1.7) &&(&&(A, B), C)
gibi özü bu ifade olabilir. İfadeler soldan sağa val b = true && false && true
Boolean#&&
gibi normal operatör telkin yöntemini çağırır başı olarak ilişkili olduğunu fark ettim.
CEVAP
Gerçekten bu hile gibi. Bunu yapmak için varolan herhangi bir yol bilmiyorum, pek bir anlam ifade etmiyor ki ... herhangi bir sorun olacağını sanmıyorum. Not
bir oluşturmak için herhangi bir yol düşünemiyorum.
Standart kitaplığa ekleme için... belki de. Ama biraz zor sanırım. Öte yandan, nasıl dahil Scalaz oğlum. Çok daha fazlası gibi kendi yetki görünüyor.
Nasıl tulumu desen eşleşen bir dizin a...
Grep sadece arama desen eşleşen sözcük...
Ne desen unıx/linux kabuk eşleşen zama...
appcompat v7:21.0.0': verilen adı...
Tüm (değil)gizlemek Vim eşleşen satırl...