Forum: D Programlama Dili RSS
Lambdalarda if kullanımı
kerdemdemir #1
Üye Eyl 2013 tarihinden beri · 53 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Lambdalarda if kullanımı
Selamlar;

"map" fonksiyonuna şu aşağıdaki şekilde "map!(a => rowFinder(a))" bir fonksiyon gönderirken bir yardımcı fonksiyon kullanmak zorunda kaldım. Halbuki isteğim tek satırda işimi bitirmekti.

int rowFinder( int number )
{
    if ( number == 0 )
        return 3;
    else
        return (number-1) / 3 ;
}

int main(string[] argv)
{
...
    auto numList = to!dstring(stdin.readln().chomp()).map!( a => to!int(a) - 48 ).uniq().array();
...
    auto minVal = numList.reduce!(min);
    auto maxCol = numList.filter!(a => a != minVal ).map!( a => rowFinder(a) ).reduce!(max);
...
}


Olmasını istediğim formatta şuydu: map!( a => if (a == 0) a = 3; else a = a -1 /3 ; )
Fakat bunu derleyedim. Mutlaka benim beklentim de dilin bilmediğim noktalarından dolayı sorunlar çıktı.

 Sizlere iki sorum var,

 1 - Fonksiyon alan standart kütüphane metodlarına lambdalar ile fonksiyon gönderirken koşul ifadeleri tek satırda nasıl yazabilirim?

 2 - Asıl daha çok şey öğreniceğim soru; yukarda benim düşüncemin çalışmamasının nedeni tam nedir acaba?

Erdemdem
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4412 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Temel sorun, if'in bir deyim olması... Deyimler değer değildirler, ifadeler değerdirler. map, ifade alıp değer ürettiğinden => işlecinin sağ tarafına bir ifade koymamız gerekiyor.

Bu durumdaki en kolay çözüm, ?: işlecini kullanmaktır (buradaki kodları derlemeden yazıyorum):
    map!( a => (a == 0 ? 3 : a -1 /3))

Ama daha karmaşık durumlarda işlev kullanmaktan başka çare yok ve sakıncası da yok:
// :)
auto şuHaleGelmişleri(R)(R aralık) {
    // Gerekirse yerel işlev olarak saklanabilir de:
    auto karmaşıkİşlev(E)(E eleman) {
        // ...
        return birSonuç;
    }
 
    return aralık.map!(e => karmaşıkİşlev(e));
}
 
// ...
 
    numList.şuHaleGelmişleri.filter!(vs).map!(vs).vs.;

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-06-24, 22:27:27 (UTC -07:00)