Proc dan Lambda
Termasuk bagian Logika dan Alur dalam perjalanan Ruby di Coddy. Pelajaran 19 dari 56.
Sebuah blok bukan object, jadi kamu tidak bisa menyimpannya dalam variabel. Jika kamu ingin potongan kode yang bisa kamu teruskan, simpan, dan panggil nanti, bungkus kode tersebut dalam Proc atau lambda.
Proc dibuat dengan Proc.new atau kata kunci proc. Panggil dengan .call:
double = proc { |n| n * 2 }
puts double.call(5) # 10
puts double.call(7) # 14Lambda mirip, tetapi lebih ketat. Lambda memeriksa apakah kamu memberikan jumlah argumen yang tepat. Bentuk panah -> adalah penulisan yang umum:
square = ->(n) { n * n }
puts square.call(4) # 16
puts square.(4) # 16 (bentuk singkat dari .call)Keduanya dapat diteruskan ke method yang mengharapkan blok dengan menambahkan awalan &:
[1, 2, 3].map(&double) # [2, 4, 6]
[1, 2, 3].map(&square) # [1, 4, 9]Gunakan lambda saat kamu menginginkan pemeriksaan argumen yang lebih ketat, gunakan Proc saat kamu menginginkan perilaku yang lebih fleksibel dan toleran.
Tantangan
MudahBuat lambda bernama tripler yang menerima satu angka dan mengembalikan angka tersebut dikalikan 3.
Lalu baca list bilangan bulat yang dipisahkan koma dan cetak, pada baris terpisah:
- Hasil pemanggilan
tripler.call(10) - Angka input yang dikalikan 3 (gunakan
map(&tripler)) dan digabung dengan,
Untuk input 1,2,3, output-nya adalah:
30
3, 6, 9Coba sendiri
# TODO: definisikan `tripler` sebagai lambda
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: baris 1, cetak tripler.call(10)
# TODO: baris 2, gunakan map pada numbers dengan &tripler, lalu gabungkan dengan ", "
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika dan Alur
1Mendalami String
Ringkasan Method StringInterpolasi StringMenelusuri StringMemisahkan dan MenggabungkanRekap: Perangkai String4Block, Proc, dan Lambda
Apa Itu Block?do..end vs Kurung KurawalKata Kunci yieldParameter BlockProc dan LambdaRangkuman, Iterator Kustom5Andalan Enumerable
Select dan RejectMerangkai MapReduce / Injectcount, all?, any?, none?group_by dan partitionsort_by, min_by, max_byRekap: Alur Data8Pengambilan Keputusan Lanjutan
Case dengan class & regexwhen dengan Banyak NilaiOperator Ternaryif / unless SebarisUlasan, Pengklasifikasi NilaiLatihan sendiri: Compiler Ruby online