2013-02-27 32 views
12

ile eşleşiyorsa Verim, bir döngü ve bir desen eşlemesine dayanan farklı durum sınıfı nesnelerinin bir listesini yapıyorum. varsayılan kutusuna isabet eden öğeleri hariç tutmak (atlamak) (temelde listeyi filtrelemek ve türlere bir adımda eşleme yapmak).Yalnızca model eşleşme

Tüm olasılıkları görmek için muhtemelen Scala için çok yeni. Benim girişimi:

val events = for (ev <- data) yield { 

     ev.sport match { 
      case "FOOTBALL" => new FootballEvent(ev) 
      case "SOCCER" => new SoccerEvent(ev) 
      case _ => None 
     } 

    } 

sonradan listeye filtre olabilir, ama orada şüpheli Bunu yapmanın bazı fantezi Scala yolu bu en iyi yapılmalıdır nasıl bir fikrin varsa bana bildirin

:) var !

+0

Yalnızca iki durum varsa, üç veya daha fazla yerine, bu tek bir "... verim" için yapılabilir - burada bir örnek: '{Bazı (x) <- Bazı (Yok: Seçenek [String])} getiri "buraya gelmemeli" ' –

cevap

27

O sözdizimi verim olduğunu değil, ancak desen eşleştirme ile toplamak kullanabilirsiniz: o kadar iyi alışkanlık "öteki" durumunda başarısız .map ve .foreach bilinen ve bunun yerine sadece eşsiz öğeleri damla

val events = data.collect { ev => ev.sport match { 
    case "FOOTBALL" => new FootballEvent(ev) 
    case "SOCCER" => new SoccerEvent(ev) 
}} 

aksine.

+1

İlk cevap verdiğinden beri seni bırakacağım, ama ikimiz de ilk denemede haklı çıkmadık. Tamam, sözdizimi hatası düzeltildi gibi görünüyor :) –

+0

b4 topla fark etmedi. – javadba

9

for-yield numaralı standart süzgeç x <- y if f(x,..) ile elde edilir. İşte Kısmi İşlev kullanan bir örnek.

val m: PartialFunction[Event, Event] = ev => ev.sport match { 
    case "FOOTBALL" => new FootballEvent(ev) 
    case "SOCCER" => new SoccerEvent(ev) 
}; 

for { ev <- data if m.isDefindAt(ev) 
     val x = m(ev) 
} yield x 

// or, without the temporary binding: 
for (ev <- data if m.isDefindAt(ev)) yield m(ev) 

Not bu imza def collect[B](pf: PartialFunction[A, B]): CC[B] ve döner "tanımlanmış olduğu her bir elemanına verilen kısmi işlevi Mpf uygulanması ve toplama kaynaklanan yeni bir toplama sahip olduğu diğer yanıtında belirtildiği Traversable.collect ile benzerlik sonuçlar".

if olmadan bir alternatiftir bwroga bir varyasyonu olarak silinir cevap: initial haritası sonrasında Yok yoluyla (yani "0 ürün") ya da bazı (yani "1 öğe") yineleme tarafından

for { ev <- data; 
     x <- ev.sport match { 
     case "FOOTBALL" => Some(new FootballEvent(ev)) 
     case "SOCCER" => Some(new SoccerEvent(ev)) 
     case _ => None 
     } 
} yield x 

Bu filtreler .


Birisi nasıl "yeni" scaladoc bireysel yöntemlere bağlamak, Çok minnettar olurum bana söylerseniz .

+1

Teşekkürler! Scala.collection.Traversable 'http://www.scala-lang.org/api/current/scala/collection/Traversable.html için şu anki scaladocs'a olan – Joernsn

+0

numaralı bağlantıların tüm yaklaşımlarını denedim. – Davos