Procs ve Lambdalar
Coddy'nin Ruby Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 19 / 56.
Bir blok bir nesne değildir, onu bir değişkende saklayamazsınız. Etrafa aktarabileceğiniz, kaydedebileceğiniz ve daha sonra çağırabileceğiniz bir kod parçası istediğinizde, onu bir Proc veya lambda içine sararsınız.
Bir Proc, Proc.new veya proc anahtar kelimesi ile oluşturulur. Bunu .call ile çağırın:
double = proc { |n| n * 2 }
puts double.call(5) # 10
puts double.call(7) # 14Bir lambda benzerdir ancak daha katıdır, doğru sayıda bağımsız değişken geçirdiğinizi kontrol eder. Ok biçimi olan -> yaygın yazım şeklidir:
square = ->(n) { n * n }
puts square.call(4) # 16
puts square.(4) # 16 (.call için kısayol)Her ikisi de başına & eklenerek bir blok bekleyen bir metoda geçirilebilir:
[1, 2, 3].map(&double) # [2, 4, 6]
[1, 2, 3].map(&square) # [1, 4, 9]Daha sıkı argüman denetimi istediğinizde bir lambda kullanın; daha hafif, daha esnek bir davranış istediğinizde ise bir Proc kullanın.
Görev
KolayBir sayı alan ve bunu 3 ile çarparak döndüren tripler adında bir lambda oluşturun.
Ardından virgülle ayrılmış bir tam sayı listesini okuyun ve ayrı satırlarda şunları yazdırın:
tripler.call(10)çağrısının sonucu- Üç katı alınmış girdi sayıları (
map(&tripler)kullanın) ve,ile birleştirilmiş hali
1,2,3 girdisi için çıktı şudur:
30
3, 6, 9Kendin dene
# TODO: `tripler`'ı bir lambda olarak tanımla
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: satır 1, tripler.call(10) yazdır
# TODO: satır 2, numbers'ı &tripler ile map'le, ", " ile birleştir
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış bölümündeki tüm dersler
1Derinlemesine Stringler
String Metotlarına Genel BakışString InterpolationStringler Üzerinde GezinmeSplit ve JoinÖzet - String Weaver4Bloklar, Procs ve Lambdalar
Blok Nedir?do..end ve Süslü Parantezleryield Anahtar KelimesiBlok ParametreleriProcs ve LambdalarÖzet - Özel İteratör7Hashes Bölüm 2
Varsayılan Değerlerle Hash.newHash Yapıları Üzerinde Yinelemeİç İçe Hash YapılarıBirleştirme ve DönüştürmeÖzet - Frekans Sayacı10Proje - Öğrenci Kayıtları
Projeye Genel BakışÖğrenci Ekle5Enumerable Gücü
Select ve RejectMap ZincirlemeReduce / Injectcount, all?, any?, none?group_by ve partitionsort_by, min_by, max_byÖzet - Data Pipeline8İleri Seviye Karar Yapıları
Sınıflar ve Regex ile CaseÇok Değerli whenTernary OperatörüSatır İçi if / unlessÖzet - Not Sınıflandırıcı