February 16, 2014

opCmp'ın eksi, sıfır, veya artı bir değer döndürmesi gerekir. Bunu tamsayı üyeler ile sağlamanın en kolay yolu da o üyelerin değerlerini basit bir çıkartma işleminde kullanmaktır. Bu yöntemden ben de şu bölümde yararlanmıştım:

http://ddili.org/ders/d/islec_yukleme.html

Soldaki nesnenin üyesinden sağdaki nesnenin üyesi çıkartılır:

   int opCmp(const ref GününSaati sağdaki) const
   {
       return (saat == sağdaki.saat
               ? dakika - sağdaki.dakika
               : saat - sağdaki.saat);
   }

Bunun bazen yanlış sonuç doğurabileceğini aşağıdaki forum konusundan öğrendim:

http://forum.dlang.org/thread/rxeffcryouqzsakclmxp@forum.dlang.org#post-ldqktc:2418ah:241:40digitalmars.com

Tamsayı taşması nedeniyle int.min değerli nesne int.max değerli nesneden daha büyük çıkıyor.

O yüzden en iyisi eğer küçük ise vs. biçiminde açıkça kodlamakmış. Forum konusundaki kodda küçük olma durumunu özel olarak kodlarsak aşağıdaki işlev doğru işler:

   int opCmp(S sağdaki)
   {
       if (i < sağdaki.i) {
           return -1;
       }

       return i - sağdaki.i;
   }

Ali

Not: Eğer yukarıdaki saat değerlerinde olduğu gibi, üyelerin değerlerini hiçbir zaman int.min veya int.max gibi uç değerler olmadıkları garantilenirse çıkartma işlemi yine de kullanılabilir.

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