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
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)
E çift kolon " ne anlama geliyor;::&qu...
Ekle " için en iyi yol;geçerli&quo...
Nasıl bir sınıf nesnesi için özel bir ...
Sınıf.() forName vs ClassLoader.() loa...
SABUN - 'In anlamı Ne?...