Forum: D Programlama Dili RSS
Nullable! nedir?
zafer #1
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Nullable! nedir?
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?
https://github.com/zafer06 - depo
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
zafer #3
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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-oper…)
System.Nullable<int> i = null;
System.Nullable<bool> b = null;
https://github.com/zafer06 - depo
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
zafer #5
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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;
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;
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)
https://github.com/zafer06 - depo
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
zafer #7
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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.
https://github.com/zafer06 - depo
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-22, 07:00:26 (UTC -08:00)