Thread overview
Nullable! nedir?
Jan 18, 2016
zafer
Jan 25, 2016
zafer
Jan 29, 2016
zafer
Jan 29, 2016
zafer
January 18, 2016

Merhaba,

Github üzerinde kodları incelerken alias Nullable!byte = Byte; gibi bir tanımlama gördüm. Buradaki Nullable! nedir? Nasıl ve nerelerde kullanılır?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 18, 2016

Bazı arayüzlerdeki bazı referansların null olmalarının özel anlam taşımalarını daha güvenli hale getiriyor.

class C {
}

void foo(C c) {
   // C null olabilir; kullanmadan önce denetlemek şart:
   if (c) {
       // ...
   }
}

C bar() {
   // ...
   return null;
}

void main() {
   auto sonuç = bar();
   // sonuç null olabilir; kullanmadan önce denetlemek şart:
   if (sonuç) {
       // ...
   }
}

Denetlemezsek program segmentation fault ile sonlanır.

Nullable, arayüzde null bulunduğunu daha resmî (formal) hale getiriyor:

import std.typecons;

class C {
}

void foo(Nullable!C c) {
   // C null olabilir; kullanmadan önce denetlemek şart:
   if (!c.isNull) {
       // ...
   }
}

Nullable!C bar() {
   // ...
   return Nullable!C();
}

void main() {
   auto sonuç = bar();
   // sonuç null olabilir; kullanmadan önce denetlemek şart:
   if (!sonuç.isNull) {
       // ...
   }
}

Yararları:

  • foo, verilen referansın null olabileceğini açıkça belirtiyor

  • bar, null döndürebileceğini açıkça belirtiyor

  • Denetlenmeden erişildiğinde program hatayla sonlanmıyor, Nullable bir hata atıyor. (Kulağa çelişkili gibi geliyor ama :) ikinci durumda hata yakalanabilir ve program belki de işine devam edebilir. Segmentation fault olduğunda ise olay bitmiştir.)

Bu kavram bazı programlama dillerinde dil olanağı olarak geliyor. Örneğin, Swift'te kod bloklarının şu nesne null değilse işletilmesi istenebiliyor. Sanırım o dilde optional type deniyor.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 26, 2016

Anladığım kadarıyla Nullable! sablonu sadece null deger içerebilecek değişkenleri daha net bir şekilde belirtiyor. Ayrıca null değerden dolayı oluşabilecek hatalarda hatayı yakalamamız için bir altyapı sağlıyor.

C# dilindede Nullable şablonu var ancak bu şablon aynı zamanda değişkenlere null değer atayabilmeyi sağlıyor. (http://www.javablog.org/136-c-sharp-nullable-types-ve-operatoru)

System.Nullable<int> i = null;
System.Nullable<bool> b = null;

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 26, 2016

Teşekkürler; öğrenmiş oldum. :) D'de de o amaçla kullanılabiliyormuş:

import std.typecons;

Nullable!int foo(int i) {
   Nullable!int sonuç;

   if (i != 42) {
       sonuç = 1;
   }

   return sonuç;
}

void main() {
   assert(foo(42).isNull);

   const güzelSonuç = foo(7);
   assert(!güzelSonuç.isNull);
   assert(güzelSonuç == 1);
}

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 29, 2016

Rica ederim hepimizin amacı yeni bir şeyler öğrenmek :) D dilindede aynı amaçla kullanılması güzel ancak kullanımı tam anlayamadım.

sonuç değişkenine null atamak istediğimde hata aldım. Şu şeklide yaptığımda aşağıdaki hatayı alıyorum.

Nullable!int sonuç = null;

Alıntı:

>

Error: inout method std.typecons.Nullable!int.Nullable.this is not callable using a mutable object

Bunun özerine değişkeni oluşturduktan sonra değer atamayı denedim ve şöyle yaptım; ancak yine hata aldım. sonuç değişkeninin init özelliğine baktığımda Nullable.null şeklinde bir tanım görüyorum. Acaba hatam nerede yardımcı olabilir misin?

sonuç = null;

Alıntı:

>

Error: template std.typecons.Nullable!int.Nullable.opAssign cannot deduce function from argument types !()(typeof(null)), candidates are:
/usr/include/dmd/phobos/std/typecons.d(1891): std.typecons.Nullable!int.Nullable.opAssign()(T value)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 29, 2016

Anladığm kadarıyla Nullable!int türünde bir değişkene direk null ataması yapamıyoruz bunun yerine değişkenin nulify() işlevini çağırmak gerekiyor.

Eğer null değeri mutlaka kullanmak istersek, Nullable! şablonunu bu sefer bir tip ile değil bir gösterici ile çağırmamız gerekiyor. Teşekkürler.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 29, 2016

Bunun için özel bir işlevi varmış:

       sonuç.nullify();    // "null'laştır" anlamında

Düşününce mantıklı: bazı durumlarda 'null' bile geçerli bir dönüş değeri olabilir. Yani, Nullable sonucun geçersiz olduğunu belirttiğine göre, 'null' değerini bile taşıyabilmeli. Örneğin, 'null' Nullable!(int*) gibi bir tür için geçerli bir değer olabilir:

import std.typecons;

Nullable!(int*) foo(int i) {
   Nullable!(int*) sonuç;

   if (i != 42) {
       sonuç = null;    // 'null' bile geçerli bir değer
   }

   return sonuç;
}

void main() {
   assert(foo(42).isNull);

   const güzelSonuç = foo(7);
   assert(!güzelSonuç.isNull);
   assert(güzelSonuç is null);    // güzel sonuç ve null
}

Çok kafa karıştırıcı. Özellikle 'isNull' üye işlevi ile 'is null'ın farklı anlam taşımaları... :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 30, 2016

Alıntı (zafer):

>

Eğer null değeri mutlaka kullanmak istersek, Nullable! şablonunu bu sefer bir tip ile değil bir gösterici ile çağırmamız gerekiyor.

Hepsine katılıyorum ama şöyle değiştirebiliriz: Atama işlemi, Nullable nesnesinin geçerli olduğunu ve atanmakta olan değeri taşıdığını belirliyor. Dolayısıyla, nesneye null atamak da aynı kurala uyuyor. O yüzden, Nullable'ı geçersiz yapmanın tek yolu nullify().

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]