Skop

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Dalam scriptingkode, blok kode adalah tubuh struktur kontrol atau fungsi .Scope variabel atau fungsi adalah blok kode yang dapat mengaksesnya, dan itu bisa menjadi global atau lokal .Semua blok dapat mengakses variabel dan fungsi global.Blok dapat mengakses variabel dan fungsi lokal di blok orang tuanya, tetapi tidak di salah satu blok anaknya.

Variabel dan fungsi memiliki cakupan global secara default, tetapi hampir selalu lebih baik untuk menyatakannya dengan cakupan lokal karena Luau mengakses variabel dan fungsi lokal lebih cepat daripada global.Untuk memberikan scope variabel atau fungsi lokal, letakkan kata kunci local sebelum namanya saat Anda menyatakannya.

Skrip tidak dapat mengakses variabel dan fungsi global dan lokal di skrip lain.Jika Anda ingin berbagi nilai dan fungsi antara skrip, gunakan ModuleScripts .


local helloWorld = 'Hello World!'
local function printHelloWorld()
print(helloWorld)
end
printHelloWorld() -- Hello World!
  • Blok B dapat mengakses variabel lokal di blok A.
  • Blok C dapat mengakses variabel dan fungsi lokal di blok A dan B.
  • Blok A tidak bisa mengakses variabel dan fungsi lokal di blok B atau C.
  • Blok B tidak bisa mengakses variabel lokal di blok C.

Kapasitas global

Setelah Anda menyatakan variabel atau fungsi global, blok kode di skrip yang sama dapat mengaksesnya.Variabel dan fungsi memiliki cakupan global kecuali Anda menyatakannya dengan kata kunci local.

Dalam kode berikut, testVar memiliki cakupan global di dalam fungsi lokal testFunc().Ketika Luau memanggil testFunc(), ia menugaskan testVar nilai 64.The testVar memiliki cakupan global, jadi fungsi print() di luar testFunc() dapat mengaksesnya dan mencetak 64 .

Example of global functions and variables

local function testFunc() -- skop lokal
testVar = 64 -- lingkup global
end
testFunc()
print(testVar) -- 64

Dalam kode berikut, variabel global mulai pada , meningkatkan dengan setiap iterasi dari loop , dan mencetak lagi setelah itu dengan nilai akhir 4.


x = 0 -- Variabel global "x"
for i = 1, 4 do
x += 1
print("Global 'x' = " .. x)
end
print("Global 'x' = " .. x)
--[[ Hasil keluaran:
Global 'x' = 1
Global 'x' = 2
Global 'x' = 3
Global 'x' = 4
Global 'x' = 4
]]

Lebih mudah untuk menyatakan variabel dan fungsi global karena Anda tidak perlu mengetik sebanyak itu, tetapi variabel dan fungsi global memiliki kekurangan berikut dibandingkan dengan lokal:

  • Luau mengakses variabel dan fungsi global dengan pencarian hash, sehingga mahal untuk digunakan dalam hal pelaksanaan.Menggunakan variabel global dalam loop kritis waktu dapat membuatnya berjalan lebih lambat dari 10% menggunakan variabel lokal di loop yang sama.
  • Luau menyingkirkan variabel lokal setelah scope mereka berakhir, mengurangi penggunaan memori.
  • Anda dapat mengakses variabel dan fungsi global dalam skrip yang sama, tetapi tidak di antara beberapa skrip.Oleh karena itu, variabel atau fungsi global tidak memberikan manfaat apa pun atas setara lokal dalam lingkup, upvalue , atau bayangan .

Skop lokal

Luau hanya dapat mengakses variabel atau fungsi lokal di blok kode di mana Anda menyatakannya.Membuat variabel dengan scope lokal memberi Anda kontrol yang lebih ketat atas kapan dan di mana nilainya berubah.

Dalam kode berikut, fungsi testFunc() dan testVar variabel memiliki cakupan lokal.Hanya kode dalam testFunc() yang dapat mengakses variabel testVar.Variabel testVar tidak memiliki nilai di luar testFunc() , jadi memanggil print(testVar) di dalam testFunc() mencetak nilai testVar , tetapi memanggil print(testVar) di luar testFunc() mencetak nil .


local function testFunc() -- skop lokal
local testVar = 64 -- skop lokal
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil

Dalam kode berikut, variabel lokal x memiliki nilai 0 di baris 1.Saat Luau mengulang melalui loop , variabel lokal yang berbeda memiliki nilai .Kemudian, Luau mencetak variabel awal x dengan nilai yang tidak berubah 0 .


local x = 0 -- Variabel lokal "x"
for i = 1, 4 do
local x = 1 -- Variabel berbeda "x", lokal ke loop "untuk" ini
print("Loop 'x' = " .. x)
end
print("Initial 'x' = " .. x)
--[[ Hasil keluaran:
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Initial 'x' = 0
]]

Tangkap

Setelah Anda menyatakan dan menetapkan variabel lokal, Anda dapat membacanya di tingkat scope dan fungsi yang scope-nya ditutup oleh scope yang sama yang berisi variabel lokal.Teknik ini dikenal sebagai menangkap .

Dalam kode berikut, fungsi f menangkap variabel lokal x .Variabel x di f() adalah nilai up .


local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5

Bayangan

Setelah Anda menyatakan dan menetapkan variabel lokal, Anda dapat membacanya di tingkat scope dan tingkat scope turunannnya.Jika Anda menyatakan ulang dan mengubah variabel dalam levelscope turunan, maka Anda membuat variabel lokal baru dengan nama yang sama tetapi nilai yang berbeda dari penugasan sebelumnya paling banyak.Variabel lokal baru tidak memengaruhi variabel lokal dari pekerjaan sebelumnya.Teknik ini, yang dikenal sebagai bayangan , membantu Anda menggunakan kembali nama variabel tanpa menggunakan kembali nilainya.

Dalam kode berikut, Luau menyalin variabel x . Variabel x di f() adalah variabel bayangan .


local x = 5
local function f()
local x = 7
print(x)
end
f() -- 7
print(x) -- 5

Anda juga dapat menyatakan ulang variabel lokal tanpa menetapkan nilai kepadanya sehingga Anda dapat mengubah variabel di kedua tingkat scope dan tingkat scope turunannya.Mengumumkan kembali variabel lokal tanpa menetapkan nilai kepadanya mengatur nilainya menjadi nil .

Dalam kode berikut, Luau menyalin variabel lokal fruitName di fungsi getFruitByColor() .Fungsi mendeklarasikan ulang fruitName sebagai variabel bayangan baru dan menetapkan nilainya menjadi nil .Fungsi memiliki levelskop anak, sebuah loop , yang menugaskan nilai ke .Setelah loop for, fungsi mengembalikan variabel bayangan fruitName.Sepanjang seluruh fungsi, fruitName adalah variabel lokal yang sama yang tidak menulis ulang variabel lokal awal fruitName.


local fruitName = "Chocolate"
local fruitTable = {
Lemon = "Yellow",
Apple = "Red",
Orange = "Orange"
}
local function getFruitByColor(color)
local fruitName
for key, value in fruitTable do
if value == color then
fruitName = key
end
end
return fruitName
end
local fruit = getFruitByColor("Yellow")
print(fruit) -- Jeruk
print(fruit .. ", not " .. fruitName) -- Lemon, not Chocolate