0Pricing
Ruby Academy · Pelajaran

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.call

Variabel 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.call

Closure 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 total

Bertahan 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.call

Keadaan 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.call

Parameter 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 100

Variabel 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  # unchanged

Membuat 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).inspect

Mengenkapsulasi 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.call

Menyatukannya

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.call

Pertanyaan 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

  1. Rangkuman Block
  2. Proc
  3. Lambda
  4. Closure dan Scope
← Kembali ke Ruby Academy