Alıntı

Scala Nil, Nothing, Null

Sahipleri : Yusuf Boyacıgil
Scala'da Nil, Nothing, Null İfadeleri ve Farkları
Herşey aşağıdaki gibi bir fonksiyon/metodu anlamaya çalışırken gelişti:
scala> def dup[T](x: T, n:Int): List[T] = if (n==0) Nil else x :: dup(x,n-1)
dup: [T](x: T, n: Int)List[T]
Burada herhangi tipteki nesneyi n kere çoğatıp sonunda o tipte bir liste üreten bir fonkisyon tanımı var.
scala> dup("yusuf", 2)
res31: List[java.lang.String] = List(yusuf, yusuf)
Yukarıda bu fonksiyonu String tipinde bir nesne ile çağırdığımız zaman elde ettiğimiz sonucu görüyoruz. ;)
Fonksiyon ne yapıyor? n 0 olana dek x‘i bir listenin başına ekliyor. :: listeler için tanımlı ve elm :: list şeklinde kullanılan ve elemanı listenin başına eklemek için tanımlı bir operatördür. Yani:
dup("yusuf", 2) -> "yusuf" :: dup("yusuf", 1)
dup("yusuf", 1) -> "yusuf" :: "yusuf" :: dup("yusuf", 0)
dup("yusuf", 0) -> "yusuf" :: "yusuf" :: Nil
En sondaki Nil‘e dikkat! Nil Java’cı biri için null‘sa haliyle bu NPE’ye neden olur diye düşündüm ilk olarak. Ama fonksiyon çalıştı. Nasıl? Demek ki Nil eşittir null doğru değil. Hadi diyelim Nil null değil. İyi de :: operatörü nasıl çalışıyor? O zaman type inference diye geçen, derleyicinin burada akıllı bir şekilde Nil’in boş bir liste olacağını anlayıp ona göre bir düzenleme yaptığı geldi aklıma. Ama o da değilmiş!
Scala API dokümanına bakınca, Nil’in boş bir List’e olduğunu gördüm:
object Nil extends List[Nothing] with Product with Serializable
Nothing?!! Nothing scala’da tanımlı tüm tiplerin alt tipiymiş. İyi de bu ne demek? Scala’da tüm tipler scala.Any tipinden geliyor. Java’daki java.lang.Object gibi. Any’nin iki direkt alt tipi var biri scala.AnyVal diğeri scala.AnyRef. İlki Java’daki int, double, float gibi sabit bir değer içeren tipleri, ikincisi de geri kalan diğer tüm tipleri ifade ediyor. Nothing‘in Any’den gelen diğer tüm tiplerin bir alt tipi olması demek Nothing herhangi tipe referans olarak kullanılabilir demek. Ne var ki Nothing tipinde bir nesne yaratmazsınız. Hiç/hiçlik bilinir ama gösterilemez yani ;)
List[Nothing] de bu durumda herhangi bir tipteki boş liste demektir. Çünkü hem Nothing tüm tiplerin alt tipidir hem de Nothing tipinde bir nesne olamayacağında göre liste boş olmak zorundadır. Bu yüzden de Nil‘in List[Nothing] olarak ifade edilmesi ve List[T] yani T tipindeki herhangi bir boş liste olması mantıklı hale gelmiş olur.
scala> val emptyListOfString:List[String] = List[Nothing]()
emptyListOfString: List[String] = List()
scala> val emptyListOfInt:List[Int] = List[Nothing]()
emptyListOfInt: List[Int] = List()
scala> val nonEmptyIntListCannotBeDefinedThisWay:List[Int] = List[Nothing](1)
:7: error: type mismatch;
 found   : Int(1)
 required: Nothing
       val nonEmptyIntListCannotBeDefinedThisWay:List[Int] = List[Nothing](1)
scala> def f(x:Nothing) = println("foo")
f: (x: Nothing)Unit
scala> f(5)
:9: error: type mismatch;
 found   : Int(5)
 required: Nothing
              f(5)
                ^

Yukarıdaki örnekteki f fonksiyonuna dikkat! Bu metodu hiçbir zaman çağıramazsınız. Zira çağıracak hiçi hiçbir zaman yaratamayacaksınız!
Nothing Scala’da hiç bitmesini istemediğimiz fonksiyonların dönüş tipi olarak kullanılır. Bir fonksiyonun dönüş tipi Nothing ise ve Nothing diye bir nesne üretemeyeceğimize göre bu fonksiyon bu tipte hiçbir değer üretemeyeceği için bitemeyecektir!
Nothing ile ilgili bir başka şey Null tipinin Nothing’den türemesidir. Null scala’da tanımlı bir başka tiptir ve sadece ama sadece bir objesi (instance’ı) vardır o da null’dur. null Java’daki null’un aynısıdır hiçbir nesneye referans olmayan bir değeri ifade etmek için kullanılır.
“Nil, Nothing, Null… Bunlara ne gerek vardı?”, “Java’daki gibi null neyinize yetmedi de bunları uydurdunuz?” diyebilirsiniz. Bunlar programlama mantığı açısından bakıldığında hem olması gereken yapılar hem de programlamada düşülen bazı tuzakları önlemek, programcının işini kolaylaştırmak adına iyi bir programlama dilinde olması gereken özellikler.
zafer.teker , 06.05.2018

Bu Sayfayı Paylaş:

Fibiler Üyelerinin Yorumları


Tüm üyeler içeriklere yorum ekleyerek katkıda bulunabilir : Yorum Gir

Misafir Yorumları




Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir