0Pricing
Lua Academy · Pelajaran

Upvalue Bersama di antara Closure

Pelajari beberapa closure yang berbagi upvalue yang sama dan dampak mutasinya.

Upvalue Bersama di antara Closure adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 2 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 Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.

Berbagi Upvalue yang Sama

Dua fungsi penutup yang didefinisikan dalam lingkup yang sama dapat berbagi sel upvalue yang benar-benar sama. Perubahan oleh salah satunya akan terlihat oleh yang lain.

local function makeGetterSetter()
  local value = 0
  local function get() return value end
  local function set(v) value = v end
  return get, set
end
local get, set = makeGetterSetter()
set(42)
print(get())  -- 42

Mengapa Upvalue Dibagikan

Lua tidak menyalin upvalue untuk setiap fungsi penutup. Semua fungsi penutup yang dibuat di blok yang sama dan menunjuk ke variabel lokal yang sama akan berbagi satu sel upvalue.

Pola Pengamat melalui Upvalue Bersama

Upvalue bersama dapat berperan sebagai bus pesan antara beberapa fungsi penutup.

local count = 0
local inc = function() count = count + 1 end
local dec = function() count = count - 1 end
local get = function() return count end
inc(); inc(); dec()
print(get())  -- 1

Jebakan Variabel Perulangan

Dalam perulangan numeric for, setiap iterasi membuat variabel lokal perulangan yang baru, sehingga fungsi penutup menangkap upvalue yang terpisah.

local fns = {}
for i = 1, 3 do
  fns[i] = function() return i end
end
print(fns[1](), fns[2](), fns[3]())  -- 1 2 3 (each closure has its own i)

Jebakan Variabel Perulangan while

Dalam perulangan while, jika Anda menutup sebuah variabel yang terus berubah, semua fungsi penutup berbagi upvalue yang sama dan melihat nilai akhirnya.

local fns = {}
local i = 0
while i < 3 do
  i = i + 1
  fns[i] = function() return i end  -- all share same i!
end
print(fns[1]())  -- 3 (not 1!)

Menangkap Variabel Lokal Baru

Untuk menangkap nilai yang terpisah dalam perulangan while, buat variabel lokal baru di dalam badan perulangan.

local fns = {}
local i = 0
while i < 3 do
  i = i + 1
  local ci = i  -- new local per iteration
  fns[i] = function() return ci end
end
print(fns[1]())  -- 1, fns[2]() == 2

Pola Modul dengan Keadaan Bersama

Sebuah modul dapat mengekspos beberapa fungsi yang berbagi tabel keadaan privat melalui upvalue.

local function makeStack()
  local data = {}
  return {
    push = function(v) data[#data+1] = v end,
    pop  = function() local v = data[#data]; data[#data]=nil; return v end,
    size = function() return #data end,
  }
end

Aliasing dan Perubahan

Berhati-hatilah: semua fungsi penutup yang merujuk upvalue yang sama akan segera melihat perubahan yang sama. Hal ini kuat, tetapi dapat menyebabkan keterkaitan yang tidak diinginkan.

Identitas Upvalue

debug.upvalueid(f, n) mengembalikan identitas unik upvalue ke-n dari fungsi f. Dua fungsi penutup dengan ID upvalue yang sama berbagi sel yang sama.

debug.upvaluejoin

debug.upvaluejoin(f1, n1, f2, n2) membuat upvalue ke-n dari f1 berbagi sel yang sama dengan upvalue ke-n dari f2. Ini adalah alat tingkat rendah untuk penelusuran kesalahan.

Pola Praktis

  • Pasangan pengambil/penyetel yang berbagi variabel privat.
  • Pencacah peristiwa dengan pengaturan ulang yang diekspos melalui beberapa fungsi penutup.
  • Keadaan modul yang dibagikan oleh beberapa fungsi API.

Pertanyaan tentang Upvalue Bersama

Dua fungsi penutup get dan set dibuat dalam lingkup yang sama, dan keduanya menangkap value. Jika set(99) dipanggil, apa yang dikembalikan oleh get()?

Ringkasan: Upvalue Bersama

Fungsi penutup dalam lingkup yang sama berbagi sel upvalue. Perubahan akan segera terlihat oleh semua fungsi penutup yang berbagi sel tersebut. Inilah dasar enkapsulasi dan keadaan modul dalam Lua.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Upvalue Bersama di antara Closure” gratis?

Ya — teks lengkap “Upvalue Bersama di antara Closure” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Upvalue Bersama di antara Closure”?

Pelajari beberapa closure yang berbagi upvalue yang sama dan dampak mutasinya. Kamu berlatih Lua 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 Lua Academy?

Tidak diperlukan pengalaman sebelumnya. Lua 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 2 dari 4.

Berapa lama pelajaran “Upvalue Bersama di antara Closure” 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 Lua Academy ini?

Ya. Setiap pelajaran Lua 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. Apa Itu Upvalue?
  2. Upvalue Bersama di antara Closure
  3. Fungsi Factory dan Generator
  4. Memoisasi dengan Closure
← Kembali ke Lua Academy