Closure dan Scope
Tangkap variabel.
Closure dan Scope adalah pelajaran Ruby Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Ruby Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Ruby Academy mencakup 4 pelajaran total.
Menangkap Variabel
Closure adalah fungsi yang mengingat variabel dari tempatnya didefinisikan, bahkan setelah tempat tersebut selesai dijalankan. Proc dan lambda merupakan closure.
name = "Ada"
greeter = -> { puts "Hello, #{name}" }
greeter.callVariabel Ikut Bersamanya
Closure tidak menyalin nilainya; closure menyimpan referensi langsung ke variabel tersebut. Jika Anda mengubah variabel itu nanti, closure akan melihat nilai barunya.
count = 0
reader = -> { count }
count = 5
puts reader.callClosure Dapat Mengubah Nilai
Karena referensinya tetap aktif, closure juga dapat mengubah variabel yang ditangkapnya.
total = 0
adder = ->(n) { total += n }
adder.call(3)
adder.call(7)
puts totalBertahan setelah Metode Pembungkus Selesai
Variabel yang ditangkap tetap hidup selama closure masih hidup, bahkan setelah metode yang membuatnya mengembalikan nilai.
def counter
n = 0
-> { n += 1 }
end
c = counter
puts c.call
puts c.call
puts c.callKeadaan Independen
Setiap pemanggilan metode pembuat menghasilkan variabel baru, sehingga closure yang terpisah mempertahankan keadaan yang terpisah pula.
def counter
n = 0
-> { n += 1 }
end
a = counter
b = counter
puts a.call
puts a.call
puts b.callParameter Blok Bersifat Lokal
Parameter yang dideklarasikan di antara tanda pipa bersifat lokal bagi blok dan tidak pernah bocor ke luar, meskipun ada variabel dengan nama yang sama.
x = 100
[1, 2, 3].each { |x| }
puts x # still 100Variabel Lokal Blok
Daftarkan nama tambahan setelah titik koma di antara tanda pipa untuk memaksa nama-nama tersebut menjadi lokal bagi blok, sehingga variabel di luar terlindung dari perubahan yang tidak disengaja.
y = "outer"
[1].each { |i; y| y = "inner" }
puts y # unchangedMembuat Fungsi yang Dapat Dikonfigurasi
Closure memungkinkan Anda memasukkan konfigurasi ke dalam sebuah fungsi sekali, lalu menggunakannya kembali berkali-kali.
def power_of(exp)
->(base) { base ** exp }
end
square = power_of(2)
cube = power_of(3)
puts square.call(5)
puts cube.call(2)Closure dalam Iterasi
Jebakan umum: closure yang dibuat dalam perulangan menangkap variabel, bukan cuplikan nilainya. Membuat closure pada setiap iterasi akan menangkap setiap nilai secara terpisah.
funcs = [1, 2, 3].map { |i| -> { i } }
puts funcs.map(&:call).inspectMengenkapsulasi Keadaan Privat
Closure dapat menyembunyikan keadaan di balik fungsi, sebagai bentuk awal objek. Di sini, saldo tidak dapat dijangkau kecuali melalui lambda yang dikembalikan.
def make_account(start)
balance = start
deposit = ->(n) { balance += n }
show = -> { balance }
[deposit, show]
end
dep, show = make_account(100)
dep.call(50)
puts show.callMenyatukannya
Closure mengikat kode pada tempat asalnya:
- Closure menangkap referensi aktif ke variabel di sekitarnya.
- Keadaan tetap ada setelah metode pembungkus mengembalikan nilai.
- Setiap closure menyimpan variabel independennya sendiri.
def tagger(prefix)
->(text) { "[#{prefix}] #{text}" }
end
warn = tagger("WARN")
puts warn.call("low disk space")Uji Cepat
Uji pemahaman Anda tentang closure.
Ringkasan
Anda telah mempelajari closure dan lingkup:
- Proc dan lambda menangkap variabel di sekitarnya berdasarkan referensi.
- Keadaan yang ditangkap bertahan lebih lama daripada metode pembungkusnya.
- Setiap closure memiliki keadaan yang independen.
- Parameter blok tetap lokal; gunakan
;untuk variabel lokal blok.
def stepper(by)
pos = 0
-> { pos += by }
end
s = stepper(5)
puts s.call
puts s.callPertanyaan yang Sering Diajukan
Apakah pelajaran “Closure dan Scope” gratis?
Ya — teks lengkap “Closure dan Scope” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Ruby Academy, upgrade ke CoddyKit PRO. Kursus Ruby Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Closure dan Scope”?
Tangkap variabel. Kamu berlatih Ruby Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Ruby Academy?
Tidak diperlukan pengalaman sebelumnya. Ruby Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Closure dan Scope” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Ruby Academy ini?
Ya. Setiap pelajaran Ruby Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Rangkuman Block
- Proc
- Lambda
- Closure dan Scope