Proc'lar ve Lambda'lar
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. Etrafında dolaştırabileceğin, kaydedebileceğin ve daha sonra çağırabileceğin bir kod parçası istediğinde, onu bir Proc veya bir lambda içine sararsın.
Bir Proc, Proc.new veya proc anahtar sözcüğüyle oluşturulur. .call ile çağırın:
double = proc { |n| n * 2 }
puts double.call(5) # 10
puts double.call(7) # 14Lambda benzerdir ancak daha katıdır; doğru sayıda bağımsız değişken aktardığını kontrol eder. Ok biçimi -> yaygın yazımdır:
square = ->(n) { n * n }
puts square.call(4) # 16
puts square.(4) # 16 (.call için kısaltma)Her ikisi de, başına & eklenerek bir blok bekleyen metoda aktarılabilir:
[1, 2, 3].map(&double) # [2, 4, 6]
[1, 2, 3].map(&square) # [1, 4, 9]Daha sıkı bağımsız değişken denetimi istediğinde bir lambda kullan; daha hafif ve daha hoşgörülü bir davranış istediğinde bir Proc kullan.
Görev
Kolaytripler adlı, bir sayı alan ve bu sayıyı 3 ile çarparak döndüren bir lambda oluşturun.
Ardından virgülle ayrılmış bir tamsayı listesi okuyun ve ayrı satırlarda şunları yazdırın:
tripler.call(10)çağrısının sonucu- Girdi sayılarını üç katına çıkarın (
map(&tripler)kullanın) ve,ile birleştirin
1,2,3 girdisi için çıktı şöyledir:
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
1Dizeler Detaylı İnceleme
Dize Metotlarına Genel BakışDize EnterpolasyonuDizeler Üzerinde YinelemeBölme ve BirleştirmeTekrar - Dize Dokuyucu4Bloklar, Proc'lar ve Lambda'lar
Blok Nedir?do..end ve Süslü Parantezleryield Anahtar SözcüğüBlok ParametreleriProc'lar ve Lambda'larÖzet - Özel Yineleyici7Hash'ler 2. Bölüm
Varsayılanlarla Hash.newHash'ler Üzerinde Yinelemeİç İçe Hash'lerBirleştirme ve DönüştürmeTekrar - Frekans Sayacı10Proje - Öğrenci Kayıtları
Projeye Genel BakışÖğrenci Ekle5Enumerable Gücü
Seçme ve ReddetmeMap ZincirlemeReduce / Injectcount, all?, any?, none?group_by ve partitionsort_by, min_by, max_byTekrar - Veri HattıKendi başına pratik yap: Online Ruby derleyicisi