SORU
16 Ocak 2010, CUMARTESİ


Sınıf Seçeneğini[T] ne anlamı var?

Scala Option[T] sınıf nokta anlamak mümkün değil. , null None herhangi bir advanages görmemek mümkün değil.

Örneğin, kodu göz önünde bulundurun:

object Main{
  class Person(name: String, var age: int){
    def display = println(name " " age)
  }

  def getPerson1: Person = {
    // returns a Person instance or null
  }

  def getPerson2: Option[Person] = {
    // returns either Some[Person] or None
  }

  def main(argv: Array[String]): Unit = {
    val p = getPerson1
    if (p!=null) p.display

    getPerson2 match{
      case Some(person) => person.display
      case None => /* Do nothing */
    }
  }
}

Şimdi, getPerson1 null, çağrı main ilk satırında display yapılan döndürür yöntemi NPE ile başarısızlığa mahkum olduğunu varsayalım. Eğer getPerson2 iade benzer şekilde None, display Ara yine benzeri bir hata ile başarısız olur.

Eğer öyleyse, neden Scala basit bir yaklaşım Java kullanılan yerine aşağıdaki yeni değeri sarıcı (Option[T]) getirerek işleri daha da karmaşıklaştırıyor?

GÜNCELLEME:

@Mitch'In öneri. başı olarak benim kod düzenlenebilir Hala Option[T] belirli bir avantaj göremedim ben. Olağanüstü test etmek için null var ya 18* *Her iki durumda da. :(

Eğer düzgün @Michael's reply, anladım Option[T] sadece avantaj açıkça programcı olduğunu söylerbu yöntem Hiç dönebilir? Bu tasarım seçimi arkasındaki tek sebep mi?

CEVAP
17 Ocak 2010, Pazar


Eğer kendinizi asla get kullanmak için zorlarsan Option anlamı daha da iyi olacaksınız. get eşdeğer olduğundan, "Tamam, beni boş araziyi geri göndermek".

Yani, senin o örnek alın. Nasıl get kullanmadan display arar mısın? İşte size bazı seçenekler

getPerson2 foreach (_.display)
for (person <- getPerson2) person.display
getPerson2 match {
  case Some(person) => person.display
  case _ =>
}
getPerson2.getOrElse(Person("Unknown", 0)).display

Bu alternatiflerin hiçbiri var olmayan bir şey üzerinde display diyelim.

get neden var gelince, Scala sizin yazdığınız kodu nasıl olması gerektiğini söylemiyor. Hafifçe dürtmek olabilir, ama eğer hiçbir güvenlik ağı tekrar aşık etmek istiyorsanız, bu sizin seçiminiz.


Burada çaktın:

Seçeneği sadece avantaj[T] bunu açıkça söyleyen programcı bu yöntem olabilir Yok dönmek?

Hariç "sadece". Ama bana başka bir şekilde ifade edeyim:anaT Option[T] avantaj tipi emniyet. Derleyici izin vermez gibi olmayabilir bir nesneye T gönderme yöntemi, olmayacaktır sağlar.

Her iki durumda da null sınamak için olduğunu söylemiştin, ama sen unut ... ya da ... bilmiyorum null için kontrol etmelisiniz, derleyici söyle, olur mu? Ya kullanıcılar?

Java ile birlikte çalışabilirlik nedeniyle elbette, Scala Java gibi boş değerlere izin verir. Eğer öyleyse Java kütüphanelerini kullanıyorsanız, eğer kötü yazılmış Scala kitaplığı kullanıyorsanız, ya da eğer eğer kötü yazılmış kullanırsanızkişiselScala kütüphaneler, hala boş işaretçiler ile uğraşmak zorunda kalırsın.

Option ben iki önemli avantaj olabilir diğer

  • Belgeler: imza türü bir nesne her zaman döndürülen olup olmadığını söyleyecektir bir yöntem.

  • Composability Monadic.

Bunlardan ikincisi çok daha uzun tam takdir alır, ve sadece karmaşık kod üzerinde gücünü gösterir de basit örnekler için uygun değil. Bu yüzden, aşağıda bir örnek vereceğim, ama pek de zaten bunu yapan insanlar dışında bir anlamı olacak farkındayım.

for {
  person <- getUsers
  email <- person.getEmail // Assuming getEmail returns Option[String]
} yield (person, email)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bobono1baby

    bobono1baby

    14 AĞUSTOS 2011
  • MikeyMacintosh

    MikeyM

    28 Aralık 2009
  • MofoHifi Records

    MofoHifi Rec

    15 HAZİRAN 2006