2012-05-02 27 views
14

tutulan yöntemler yöntemlerinin bir seçenek türü döndüren veri blokları oluşturduğu zincirleme yöntemlerinin bir yolu var mı? Bir önceki çağrı Geri Dönmezse, sonraki yöntemi aramak istiyorum. Bunu, bu snippetGetOrElse'nin yaptığı gibi bir Seçenek Türü döndüren ancak seçenek türü

def amountToPay : Option[TextBoxExtraction] = 
    getMaxByFontsize(keywordAmountsWithCurrency) match { 
    case None => getMaxByFontsize(keywordAmounts) match { 
     case None => highestKeywordAmount match { 
     case None => getMaxByFontsize(amountsWithCurrency) match { 
      case None => highestAmount 
      case some => some 
     } 
     case some => some 
     } 
     case some => some 
    } 
    case some => some 
    } 

ile gerçekleştirebiliyorum ancak oldukça karışık görünüyor. Yani umarım bunu yapmanın daha alçak yolu vardır.

def amountToPay : Option[TextBoxExtraction] = 
    getMaxByFontsize(keywordAmountsWithCurrency) 
    .orElse(getMaxByFontsize(keywordAmounts)) 
    .orElse(highestKeywordAmount) 
    .orElse(getMaxByFontsize(amountsWithCurrency)) 
    .orElse(highestAmount) 

Ayrıca sadece Seq öğeleri koymak ve sonra xs.reduceLeft(_ orElse _) veya xs.flatten.headOption.getOrElse(highestAmount) gibi bir şey kullanabilirsiniz:

+2

Aradığın şey değil, ancak başarıyı zincirlemek istiyorsanız ('' x'' işlevini sonraki işleve '' olarak kullanın) 'for': 'için kullanabilirsiniz (myWife <- getSpouse (me); mySIL <- getSister (myWife); myBIL <- getSpouse (mySIL); myBro <- getBrother (me); if (myBro == myBIL)), myBro ' – rampion

cevap

24

Evet, orElse biraz daha temiz olduğunu.

+0

@Nicolas değerini verirse, sürümünüzün biraz daha temiz ancak noktalı virgül olduğunu kabul ediyorum Çıkarım sizi REPL'de ısıtır. –

+2

': paste' REPL içinde hile yapacak (Ben değişiklikleri doğrudan gönderme yerine stackoverflow bir düzenleme önerebilirdim) – Nicolas

+0

Oh, ayrıca benim sürümde parantezleme _wrong_ sorunu vardı. Yani seninki daha iyi. –