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. Etrafta dolaştırabileceğiniz, kaydedebileceğiniz ve daha sonra çağırabileceğiniz bir kod parçası istediğinizde, onu bir Proc veya bir lambda içine sararsınız.
Bir Proc, Proc.new veya proc anahtar kelimesi ile oluşturulur. Onu .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 argüman geçip geçmediğinizi kontrol eder. Ok formu -> yaygın yazım şeklidir:
square = ->(n) { n * n }
puts square.call(4) # 16
puts square.(4) # 16 (.call için kısa yol)Her ikisi de, önüne & eklenerek bir blok bekleyen bir metoda aktarılabilir:
[1, 2, 3].map(&double) # [2, 4, 6]
[1, 2, 3].map(&square) # [1, 4, 9]Daha katı argüman kontrolü istediğinizde bir lambda kullanın; daha hafif, daha esnek bir davranış istediğinizde bir Proc kullanın.
Görev
KolayBir sayı alan ve bu sayıyı 3 ile çarpılmış halde döndüren tripler adında bir lambda oluşturun.
Ardından virgülle ayrılmış bir tam sayı listesi okuyun ve ayrı satırlarda şunları yazdırın:
tripler.call(10)çağrısının sonucu- Üç katına çıkarılmış (
map(&tripler)kullanın) ve,ile birleştirilmiş girdi sayıları
1,2,3 girdisi için çıktı şöyledir:
30
3, 6, 9Kopya kağıdı
Proc – bir değişkende saklanan yeniden kullanılabilir blok:
double = proc { |n| n * 2 }
double.call(5) # 10Lambda – daha katı argüman kontrolü, ok sözdizimi:
square = ->(n) { n * n }
square.call(4) # 16
square.(4) # 16 (kısayol)& kullanarak bir blok bekleyen bir metoda bir Proc/lambda geçirin:
[1, 2, 3].map(&double) # [2, 4, 6]Kendin dene
# YAPILACAK: tripler'ı bir lambda olarak tanımlayın
numbers = gets.chomp.split(",").map(&:to_i)
# YAPILACAK: 1. satır, tripler.call(10) ifadesini yazdırın
# YAPILACAK: 2. satır, numbers dizisini &tripler ile eşleyin (map), ", " ile birleştirin (join)
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ı