SORU
6 Temmuz 2009, PAZARTESİ


Bu 'Lambda herkes demişken tutar' nedir?

Bu 'Lambda' herkes demişken tutar? Bir çok insan aşk gibi görünüyor, ama bunu toplamak sadece tek bir ifadeye kod satırları çok tıkınma bir yoldur.

Birisi onun gerçek değeri konusunda beni aydınlatabilir misiniz?

CEVAP
6 Temmuz 2009, PAZARTESİ


İsim vermeden fonksiyonları

Basitçe söylemek gerekirse, bir lambda isimsiz bir fonksiyon veya anonim bir fonksiyonudur. Çalıştırılabilir kod küçük bir parça, eğer bir değişken sanki etrafında geçti olabilir. JavaScript:

function () {}; // very simple

Hadi şimdi bu Lambda kullanılıyor bakın.

Demirbaş kodu özetleme

Lambda uzak demirbaş kodu soyut olabilir. Örneğin döngüler. for yazma alıştık ve while gün boyu döngüler. Ama bu yazılı olmayan bir kod vardır. Döngü içinde kod döngünün en önemli parçası, ve geri kalanı uzakta soyut özü edebiliriz:

for (var i=0; i<array.length; i  ) {
    // do what something useful with array[i]
}

dizi nesneleri forEach kullanarak yorumlamışlardır

array.forEach(function (element, index) {
   // do something useful with element
   // element is the equivalent of array[i] from above
});

Soyutlama yukarıdaki yararlı olmayabilir, ama yüksek mertebeden fonksiyonlar, çok daha yararlı görevleri gerçekleştirmek forEach gibi diğer vardır. Örneğin 29**:

var numbers = [1, 2, 3, 4];
var even    = [];

// keep all even numbers from above array
for (var i=0; i<numbers.length; i  ) {
    if (numbers[i] % 2 === 0) {
        even.push(numbers[i]);
    }
}

alert(even);

// Using the filter method
even = [1, 2, 3, 4].filter(function (number) {
    return number % 2 === 0;
});

alert(even);

Kod çalıştırma gecikmesi

Hangi olay kavramı kullanılabilir bazı ortamlarda, Lambda zaman içinde bir noktada meydana gelebilecek olaylara yanıt vermek için kullanabiliriz.

window.onload = function () {
    alert("Loaded");
};

window.setTimeout(function () {
    alert("Code executed after 2 seconds.");
}, 2000);

Bunu başka bir şekilde yapmış olabilir, ama bu oldukça ayrıntılıdır. Java'da örneğin, Runnable arayüzü var.

Fonksiyonları fabrikalar

Bu noktaya kadar, biz sadece daha çok sözdizimsel şeker yetenekleri için Lambda kullanılır. Ama Lambda daha faydalı olabilir durumlar vardır. Örneğin return Lambda işlevleri olabilir. Hadi dönüş değerleri önbelleğe alınmış olmasını istediğimiz gibi bir işlevi var ki.

var users = [];
var getUser = function (name) {
    if (! users[name]) {
        // expensive operations to get a user. Ajax for example
        users[name] = user_from_ajax;
    }

    return users[name];
};

Daha sonra, benzer bir işlevi olduğunu fark edebiliriz:

var photos = [];
var getPhoto = function (name) {
    if (! photo[name]) {
        // expensive operations to get a user. Ajax for example
        photos[name] = photo_from_ajax;
    }

    return photos[name];
};

Açıkça orada bir işaret var, izin uzak soyut. Hadi memoization kullanın.

/**
 * @param {Array}     store Data structure in which we cache lambda's return values
 * @param {Function}  lambda
 * @return {Function} A function that caches the result of calling the lambda param
 */
var memoize = function (store, lambda) {
    // return a new lambda
    return function (name) {
        if (! store[name]) {
            // Execute the lambda and cache the result
            store[name] = lambda(name);
        }

        return store[name];
    };
};

var getUsers = memoize([], function (name) {
    // expensive operations to get a user. Ajax for example
});

var getPhotos = memoize([], function (name) {
    // expensive operations to get a photo. Ajax for example
});

, Lambda kullanarak gördüğünüz gibi, uzak önbellekleme/memoization mantığı soyut başardık. Eğer örneğin bazı çözümler olsaydı, bu sorunu neredeyse diğer teknikleri kullanarak çözülmüş olduğunu düşünüyorum. Tek bir yerde bazı önemli demirbaş kodu ayıklamak başardık. users photos global değişkenleri kurtulduk bahsetmiyorum.

Profil bakınca çoğunlukla Python bir kullanıcı olduğunuz belli. Yukarıdaki model için, Python dekoratörler kavramı vardır. example on the net for memoization dekoratörler vardır. Tek fark Python ile büyük olasılıklaadlandırılmışiç içe dekoratör işlev içinde işlev. Sebebi tek ifade Lambda desteği Python sadece. Ama mantık aynı.

Python örnek olarak lambda kullanın. Hangi çift sayılar bakacağız yukarıdaki kodu şöyle: Python ile temsil edilebilir

filter(lambda x: x % 2 == 0, [1, 2, 3, 4])

Neyse, Lambda kilitler olmadan o kadar güçlü değil. Kilitler Lambda kavramı bu kadar güçlü yapan şeydir. Memoization benim örnekte kilitler store param etrafında bir kapatma oluşturmak için kullandım. Bu şekilde, memoize işlev sonucu (lambda) döndü sonra bile param erişimi var.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 3DS Max Tutorials

    3DS Max Tuto

    4 AĞUSTOS 2013
  • GWTLecturer

    GWTLecturer

    18 EKİM 2012
  • tsweeney79

    tsweeney79

    21 Ocak 2008