SORU
28 Temmuz 2009, Salı


Birini kullanarak Scala kod hataları işlemek için

3* *monad bir şey ya hiç Scala şeyler ile başa çıkmak için büyük anlamlı bir yoldur. Ama eğer bir mesaj günlüğü gerekiyorsa zaman "hiçbir şey" oluşur? Scala API belgelerine göre

Ya da yazın sık olarak kullanılır alternatif scala için.Seçeneği nerede Sol başarısızlık (kongre tarafından) ve temsil Doğru Biraz benzer.

Ancak, en iyi uygulamalar, ya da gerçek dünya Da güzel örnek işleme hataları Da içeren kullanarak bulmak için şans vardı. Sonunda kendi projem için şu kodu buldum:

    def logs: Array[String] = {
        def props: Option[Map[String, Any]] = configAdmin.map{ ca =>
            val config = ca.getConfiguration(PID, null)
            config.properties getOrElse immutable.Map.empty
        }
        def checkType(any: Any): Option[Array[String]] = any match {
            case a: Array[String] => Some(a)
            case _ => None
        }
        def lookup: Either[(Symbol, String), Array[String]] =
            for {val properties <- props.toRight('warning -> "ConfigurationAdmin service not bound").right
                 val logsParam <- properties.get("logs").toRight('debug -> "'logs' not defined in the configuration").right
                 val array <- checkType(logsParam).toRight('warning -> "unknown type of 'logs' confguration parameter").right}
            yield array

        lookup.fold(failure => { failure match {
            case ('warning, msg) => log(LogService.WARNING, msg)
            case ('debug, msg) =>   log(LogService.DEBUG, msg)
            case _ =>
        }; new Array[String](0) }, success => success)
    }

(Lütfen bu gerçek bir projeden bir parçacık olduğunu unutmayın, kendi derleme değil yani)

Yukarıdaki kodu yeniden düzenleme Kodu ve/Either veya daha iyi fikirler nasıl kullandığınızı bilmek minnettar olurum.

CEVAP
28 Temmuz 2009, Salı


Ya da en az iki anlamlı sonuçlardan biri, tek anlamlı bir sonuca dönmek için kullanılan ya da hiç Seçenek tersine döndürmek için kullanılır.

Kolay bir örnek aşağıda verilmiştir anlamak (Scala posta listesinde bir süre önce üzerinde dolaşan):

def throwableToLeft[T](block: => T): Either[java.lang.Throwable, T] =
  try {
    Right(block)
  } catch {
    case ex => Left(ex)
  }

İşlev adı "" başarılı "(<^ sonuç . Doğru döndürür blok yürütme eğer anlaşılacağı gibi )". Eğer bir Throwable atılır aksi takdirde, "(<^ throwable . Sola döndürür )". Desen eşleştirme sonucu işlemek için kullanın:

var s = "hello"
throwableToLeft { s.toUpperCase } match {
  case Right(s) => println(s)
  case Left(e) => e.printStackTrace
}
// prints "HELLO"

s = null
throwableToLeft { s.toUpperCase } match {
  case Right(s) => println(s)
  case Left(e) => e.printStackTrace
}
// prints NullPointerException stack trace

Bu yardımcı olur umarım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EminemMusic

    EminemMusic

    9 ŞUBAT 2007
  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007
  • Leigh Momii

    Leigh Momii

    10 Mayıs 2006