Lua - Modules: A Beginner's Guide

Xin chào các bạn học lập trình! Hôm nay, chúng ta sẽ bắt đầu một chuyến hành trình thú vị vào thế giới của các mô-đun Lua. Đừng lo lắng nếu bạn là người mới bắt đầu lập trình - tôi sẽ là người hướng dẫn thân thiện của bạn, và chúng ta sẽ khám phá chủ đề này từng bước một. Vậy, chúng ta cùng vào bài nhé!

Lua - Modules

什么是模块?

Hãy tưởng tượng bạn đang xây dựng một lâu đài Lego khổng lồ. Thay vì tạo mọi thứ một lần, liệu có dễ dàng hơn nếu bạn xây dựng từng phần nhỏ riêng lẻ và sau đó ghép chúng lại với nhau? Đó chính xác là điều mà các mô-đun làm trong lập trình!

Một mô-đun trong Lua giống như một mini-chương trình chứa các hàm, biến và mã liên quan. Đó là cách để tổ chức mã của bạn thành các khúc nhỏ, dễ quản lý và tái sử dụng. Điều này làm cho chương trình của bạn dễ hiểu, bảo trì và gỡ lỗi hơn.

Ví dụ 1: Một Mô-đun Đơn Giản

Hãy tạo một mô-đun đơn giản có tên là greetings.lua:

local greetings = {}

function greetings.sayHello(name)
return "Hello, " .. name .. "!"
end

function greetings.sayGoodbye(name)
return "Goodbye, " .. name .. ". Have a great day!"
end

return greetings

Trong ví dụ này, chúng ta đã tạo một mô-đun với hai hàm: sayHellosayGoodbye. Chúng ta sẽ xem cách sử dụng mô-đun này ngay sau!

Đặc điểm của các Mô-đun Lua

Các mô-đun Lua có một số đặc điểm đặc biệt làm cho chúng mạnh mẽ và linh hoạt:

  1. Local theo mặc định: Mọi thứ trong một mô-đun đều là local除非明确指定为global. Điều này ngăn chặn xung đột tên với các phần khác của chương trình của bạn.

  2. Giá trị trả về: Một mô-đun thường trả về một bảng chứa các hàm và biến của nó, giúp chúng có thể truy cập được từ các phần khác của chương trình.

  3. Lazy loading: Các mô-đun chỉ được tải khi chúng cần thiết, điều này có thể cải thiện hiệu suất của chương trình của bạn.

Hàm require

Bây giờ chúng ta đã có mô-đun của mình, làm thế nào để sử dụng nó? Hãy gặp hàm require - vé vào thế giới kỳ diệu của mô-đun!

Ví dụ 2: Sử dụng hàm require

Hãy sử dụng mô-đun greetings của chúng ta trong một tệp khác, giả sử là main.lua:

local myGreetings = require("greetings")

print(myGreetings.sayHello("Alice"))
print(myGreetings.sayGoodbye("Bob"))

Khi bạn chạy đoạn mã này, bạn sẽ thấy:

Hello, Alice!
Goodbye, Bob. Have a great day!

Đây là những gì đang xảy ra:

  1. require("greetings") tải mô-đun của chúng ta và trả về bảng của nó.
  2. Chúng ta lưu bảng này trong myGreetings.
  3. Bây giờ chúng ta có thể sử dụng các hàm từ mô-đun của mình bằng cách gọi myGreetings.functionName().

Những Điều Cần Nhớ

Khi làm việc với các mô-đun Lua, hãy nhớ những điểm sau:

  1. Đặt tên tệp: Tên tệp của mô-đun của bạn nên khớp với tên bạn sử dụng trong require. Ví dụ, require("greetings") tìm kiếm tệp có tên greetings.lua.

  2. Tìm kiếm đường dẫn: Lua tìm kiếm các mô-đun trong nhiều nơi, bao gồm thư mục hiện tại và các thư mục được chỉ định trong biến môi trường LUA_PATH.

  3. Lưu cache: Một khi một mô-đun được tải, Lua sẽ lưu cache nó. Các cuộc gọi require tiếp theo cho cùng một mô-đun sẽ trả về phiên bản được lưu cache.

Ví dụ 3: Lưu cache Mô-đun

Hãy sửa đổi greetings.lua của chúng ta để minh họa việc lưu cache:

local greetings = {}
local count = 0

function greetings.sayHello(name)
count = count + 1
return "Hello, " .. name .. "! (Called " .. count .. " times)"
end

return greetings

Bây giờ, hãy sử dụng mô-đun này nhiều lần:

local myGreetings1 = require("greetings")
local myGreetings2 = require("greetings")

print(myGreetings1.sayHello("Charlie"))
print(myGreetings2.sayHello("David"))
print(myGreetings1.sayHello("Eve"))

Kết quả đầu ra:

Hello, Charlie! (Called 1 times)
Hello, David! (Called 2 times)
Hello, Eve! (Called 3 times)

Chú ý rằng số lần gọi tăng lên trên tất cả các cuộc gọi, ngay cả khi chúng ta sử dụng require hai lần. Điều này là vì Lua đã lưu cache mô-đun sau lần gọi đầu tiên.

Cách Cũ để Triển khai Mô-đun

Trước khi Lua 5.1 giới thiệu hệ thống mô-đun mà chúng ta đã thảo luận, có một cách cũ để tạo mô-đun. Mặc dù không khuyến khích sử dụng cho mã mới, bạn có thể gặp nó trong các chương trình cũ.

Ví dụ 4: Mô-đun Kiểu Cũ

Dưới đây là cách mô-đun greetings của chúng ta có thể trông như thế nào trong phong cách cũ:

module("greetings", package.seeall)

function sayHello(name)
return "Hello, " .. name .. "!"
end

function sayGoodbye(name)
return "Goodbye, " .. name .. ". Have a great day!"
end

Để sử dụng mô-đun này:

require("greetings")

print(greetings.sayHello("Frank"))
print(greetings.sayGoodbye("Grace"))

Trong khi cách này có thể看起来更简单, nó có những nhược điểm như làm ô nhiễm không gian tên toàn cục và tiềm ẩn xung đột tên.

Kết Luận

Chúc mừng! Bạn đã刚刚迈出进入Lua模块世界的第一步。我们已经讨论了模块是什么,如何创建和使用它们,以及一些重要的事情需要记住。 Các mô-đun là một công cụ mạnh mẽ trong bộ công cụ lập trình của bạn, giúp bạn viết mã sạch sẽ và tổ chức hơn.

Nhớ rằng, thực hành là chìa khóa của thành công. Hãy thử tạo các mô-đun của riêng bạn, thử nghiệm với các cấu trúc khác nhau, và quan trọng nhất, hãy vui vẻ! Chúc các bạn may mắn, những người chủ tương lai của Lua!

Dưới đây là tóm tắt các hàm chính chúng ta đã thảo luận:

Hàm Mô tả
require(moduleName) Tải một mô-đun và trả về bảng của nó
module(name, package.seeall) Cách cũ để tạo một mô-đun (không khuyến khích sử dụng cho mã mới)

Credits: Image by storyset