Anlama içinde null ve tip ek açıklamaları ile uğraşırken garip davranışlar gibi görünen şeyleri anlamaya çalışıyorum. Örnek olarakScala istisnası, tip ek açıklama ile anlaşılırken
: içinde
def f(): String = null
for {
a <- Option("hello")
b = f()
} yield (a, b)
sonuç beklenen:
//> res0: Option[(String, String)] = Some((hello,null))
ancak, o zaman olsun b
def f(): String = null
for {
a <- Option("hello")
b: String = f()
} yield (a, b)
türüne tür ek açıklaması eklerseniz Bir çalışma zamanı istisnası:
//> scala.MatchError: (hello,null) (of class scala.Tuple2)
Bu neden oluyor? Yine de ilk örnekte String
türünde b
örtük değil midir? İkinci örnekte açık tip ek açıklama değişiyor?
(Not, örnekler Scala 2.11.4 çalıştırıldı)
Eğer repl içinde 'reify' kullanarak görebilirsiniz olarak ikinci örnek, bir maça derler:' ithalat scala.reflect.runtime.universe ._; {for {...}}. Sana neden olduğunu söyleyemem. AIUI 'null' eşleşmiyor çünkü eşleme türü (ya da değer),' b' 'String' bir derleme zamanı türüne sahip olsa bile; Bu, bir anlamda tip sistemde bir deliktir ve scala kodu genellikle boş değerlerden kaçınmalıdır. – lmm
Ben kimsenin hayranı değilim, inan bana! Bunun üzerine tökezlediğim gerçek kodda bazı eski java kodlarıyla entegre etmek için 'try's kullanıyordum. Ancak, null burada benim için rastlantısal görünüyor: Ben tuhaf (korkutucu?) Buluyorum yönüyle (türkçe olmayan) bir çalışma zamanı istisna daha tür özgüllük sonuçları ekleyerek olmasıdır. –
Bu, bir 'for' /' verim 'türlerini bir desen eşlemesine yerleştiren bir dilin tuhaflığıdır; ifadelerde "sıradan" tiplerle ortaya çıkacak bir sorun değil. Söyleyebileceğim tek şey bu talihsiz, ama muhtemelen bu aşamada değiştirilemez; Bu sebepten ötürü bir sol/sol tarafın herhangi bir türünü vermekten kaçınmaya eğilimliyim:/ – lmm