Lua Academy · Pelajaran

Mentakrifkan dan Memanggil Fungsi

Pelajari sintaks pengisytiharan fungsi, kaedah pemanggilan serta fungsi setempat berbanding fungsi global.

Pelajaran 1 daripada 412 langkah

Mentakrifkan dan Memanggil Fungsi ialah pelajaran Lua Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Lua Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.

Sintaks Fungsi

Fungsi dalam Lua ditakrifkan dengan kata kunci function. Bahagian badan ialah blok yang ditamatkan oleh end. Fungsi boleh bersifat global atau setempat. Anda memanggil fungsi dengan menambahkan tanda kurung yang mengandungi argumen. Jika anda tidak memberikan argumen, parameter yang tiada nilainya menerima nil.

function sayHello(name)
  print("Hello, " .. (name or "World") .. "!")
end

sayHello("Lua")   -- Hello, Lua!
sayHello()        -- Hello, World!

local function add(a, b)
  return a + b
end
print(add(3, 4))  -- 7

Nilai Pulangan

Fungsi mengembalikan nilai dengan return. Tidak seperti kebanyakan bahasa, fungsi Lua boleh mengembalikan berbilang nilai. Jika anda tidak mengembalikan nilai secara jelas, fungsi tidak mengembalikan apa-apa (sifar nilai). Nilai pulangan berlebihan dibuang apabila panggilan bukan ungkapan terakhir dalam senarai.

local function minMax(t)
  local lo, hi = t[1], t[1]
  for i = 2, #t do
    if t[i] < lo then lo = t[i] end
    if t[i] > hi then hi = t[i] end
  end
  return lo, hi
end

local lo, hi = minMax({5,2,8,1,9})
print(lo, hi)  -- 1  9

Fungsi sebagai Nilai

Fungsi ialah nilai kelas pertama dalam Lua. Anda boleh menyimpannya dalam pemboleh ubah, menghantarnya sebagai argumen kepada fungsi lain dan mengembalikannya. Hal ini membolehkan panggilan balik, fungsi aras lebih tinggi dan corak pengaturcaraan berfungsi.

local ops = {
  add = function(a, b) return a + b end,
  sub = function(a, b) return a - b end,
  mul = function(a, b) return a * b end,
}

local function apply(op, a, b)
  return op(a, b)
end

print(apply(ops.add, 10, 3))  -- 13
print(apply(ops.mul, 4, 5))   -- 20

Fungsi Setempat berbanding Global

Gunakan local function untuk fungsi pembantu yang hanya digunakan dalam modul. Fungsi global mencemarkan ruang nama global dan boleh dicapai dari mana-mana sahaja, yang mungkin menyebabkan konflik nama. Dalam kebanyakan kes, utamakan fungsi setempat dan dedahkan hanya perkara yang diperlukan melalui jadual modul.

-- Bad: pollutes global namespace
function helper() end

-- Good: module-local
local function helper()
  return "I am local"
end

-- Module export pattern
local M = {}
function M.publicFunc()
  return helper()  -- can call local
end
return M

Kaedah dengan Sintaks Titik Bertindih

Lua menyediakan kemudahan sintaks untuk mentakrifkan dan memanggil kaedah pada jadual. obj:method(arg) setara dengan obj.method(obj, arg). Bentuk titik bertindih menghantar jadual secara tersirat sebagai argumen pertama, yang lazimnya dinamakan self.

local Dog = {}
Dog.__index = Dog

function Dog.new(name)
  return setmetatable({name=name}, Dog)
end

function Dog:speak()
  print(self.name .. " says: Woof!")
end

local d = Dog.new("Rex")
d:speak()   -- Rex says: Woof!

Corak Parameter Pilihan

Lua tidak mempunyai parameter pilihan terbina dalam, tetapi anda boleh mensimulasikannya dengan pemeriksaan nil. Hantar satu jadual pilihan untuk fungsi yang mempunyai banyak parameter pilihan — cara ini lebih kemas daripada senarai argumen yang panjang.

local function createUser(name, opts)
  opts = opts or {}
  return {
    name = name,
    role = opts.role or "user",
    active = opts.active ~= false,
    score = opts.score or 0,
  }
end

local u = createUser("Alice", {role="admin", score=100})
print(u.name, u.role, u.score)

Panggilan Ekor

Panggilan ekor ialah panggilan fungsi pada kedudukan ekor (tindakan terakhir sebelum mengembalikan nilai). Lua melakukan pengoptimuman panggilan ekor: panggilan ekor yang betul tidak menggunakan ruang tindanan tambahan. Hal ini membolehkan rekursi yang mendalam tanpa limpahan tindanan apabila panggilan rekursif berada pada kedudukan ekor.

local function factorial(n, acc)
  acc = acc or 1
  if n <= 1 then return acc end
  return factorial(n - 1, n * acc)  -- tail call!
end

print(factorial(10))  -- 3628800
-- Can handle very large n without stack overflow

Fungsi yang Dipanggil Serta-merta

Anda boleh mentakrifkan dan memanggil fungsi dengan serta-merta: (function() ... end)(). Hal ini berguna untuk mencipta skop setempat, melaksanakan kod persediaan tepat sekali atau mengelakkan pencemaran skop luar dengan pemboleh ubah sementara.

local result = (function()
  local temp = 100
  local adjusted = temp * 1.5
  return math.floor(adjusted)
end)()

print(result)   -- 150
-- temp and adjusted not visible here

Menyimpan Fungsi dalam Jadual

Menyimpan fungsi dalam jadual ialah reka bentuk modul Lua yang lazim. Jadual itu bertindak sebagai ruang nama. Anda mentakrifkan fungsi dengan memberikannya kepada medan jadual atau menggunakan tatatanda titik/titik bertindih bersama nama jadual.

local math2 = {}

function math2.clamp(val, lo, hi)
  return math.max(lo, math.min(hi, val))
end

function math2.lerp(a, b, t)
  return a + (b - a) * t
end

print(math2.clamp(150, 0, 100))  -- 100
print(math2.lerp(0, 10, 0.5))   -- 5.0

Penutupan sebagai Panggilan Balik

Fungsi aras lebih tinggi menerima panggilan balik. Dalam Lua, panggilan balik hanyalah nilai fungsi. Penutupan amat berguna sebagai panggilan balik kerana penutupan menangkap konteks panggilan tanpa perlu menghantar argumen tambahan melalui fungsi aras lebih tinggi.

local function forEach(t, fn)
  for i, v in ipairs(t) do
    fn(v, i)
  end
end

local sum = 0
forEach({10, 20, 30}, function(v)
  sum = sum + v
end)
print(sum)   -- 60

forEach({"a","b","c"}, function(v, i)
  print(i, v)
end)

Semakan Pantas

Apakah output bagi: local function f() return 1, 2, 3 end; local a, b = f()?

Ulang Kaji: Fungsi

Perkara penting:

  • Gunakan local function untuk mengelakkan pencemaran pemboleh ubah global
  • Fungsi ialah nilai kelas pertama: simpan dalam pemboleh ubah, jadual, dan hantarkannya sebagai argumen
  • Sintaks titik bertindih menghantar self secara tersirat
  • Simulasikan parameter pilihan dengan opts or {}
  • Panggilan ekor mengelakkan limpahan tindanan dalam rekursi mendalam
  • Fungsi yang dipanggil serta-merta menghasilkan skop yang terpencil
Percuma untuk bermula

Pelajari Lua dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
40
Pelajaran
159

Soalan Lazim

Adakah pelajaran “Mentakrifkan dan Memanggil Fungsi” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Lua Academy, termasuk “Mentakrifkan dan Memanggil Fungsi”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Mentakrifkan dan Memanggil Fungsi”?

Pelajari sintaks pengisytiharan fungsi, kaedah pemanggilan serta fungsi setempat berbanding fungsi global. Anda berlatih Lua Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Lua Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Lua Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Mentakrifkan dan Memanggil Fungsi” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Lua Academy ini?

Ya. Setiap pelajaran Lua Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mentakrifkan dan Memanggil Fungsi
  2. Nilai Pulangan Berbilang
  3. Varargs dan Operator ...
  4. Rekursi dalam Lua
← Kembali ke Lua Academy