Khi các hàm trong Lua được truyền như các giá trị, chúng được coi như là các giá trị tham chiếu, như các bảng Tham chiếu để chỉ ra 1 đố

Một phần của tài liệu Tài liệu Giới thiệu về Lua - Lệnh gán ppt (Trang 25 - 26)

tượng, với l đơn vị định danh và thời gian hoạt động, chứa phần thân của hàm (sự thi hàn mã lệnh - code implementation). Vì thế khi 1 biến hàm được gán vào hàm khác, mã lệnh hàm bản thân nó không bị sao chép mà chỉ sao chép tham chiếu.

> Íoo = function(n) return n*2 end -- tạo hàm và gán vào foo > bar = foo -- bar và foo giờ tham chiếu cùng 1 hàm

> =Íoo, bar

function: 0x687d20 function: 0x687d20 > = (Íoo == bar)

true

> =(đuncfion(n) return n*2 end) function: 0x6870c0

> = (foo == (function(n) return n*2 end)) -- không cùng hàm false

Các hàm được mô tả động (Functions are dynamically typed)

Các hàm cũng như các giá trị khác trong Lua được mô tả động. Điều này có nhĩa là chúng ta tìm ra 1 giá trị có là 1 hàm hay không chỉ khi chúng ta hỏi nó lúc thực hiện:

>xX= "onion”

> =type(x) -- Kiểu của ngươi là ji? string

> XỘ -- giờ thử gọi ngươi.

stdin:]: attempt to call global `x' (a string value) stack traceback:

stdin:]: in main chunk [C]: ?

>x=foo

> =type(x) -- Kiểu của ngươi là ji? function

> = X(77) -- giờ thử gọi ngươi. 154

Chú ý rằng chúng ta không thể gợi đối tượng x ở trên do nó là 1 chuỗi nhưng khi chúng ta gán hàm foo vào biến x, chúng ta có thể gọi nó. Đây là sự tương phản đối với các ngôn ngữ mô tả thống kê (như C) — khi biên dịch cần phải biết biến x có phải hàm hay không và trạng thái đó không thể thay đổi lúc chạy chương trình.

Chú ý rằng kiểu của 1 hàm thường đơn thuần là "function", không cần phải thu nhặt số và các kiểu của các thông số hàm và trả về giá trị: > =type(foo) -- kiểu? > =type(foo) -- kiểu?

function

Điều này khác với C, trong đó kiểu của 1 hàm chứa tham số và trả về thông tin về kiểu phải được chỉ rõ trước khi sử dụng. Trơng Lua bạn không cân mô tả kiểu của các giá trị được trả về từ hàm hoặc cho các tham số truyền vào hàm! Điều này cho phép Lua xử lý các tham số hàm và các giá trị trả về một cách linh hoạt.

Nói riêng, chúng ta không có vấn đề trong việc gán các hàm với các danh sách tham số hay trả về các giá trị cho biến x vì x không có khái niệm gì về các đối tượng gán vào nó:

> x = function(a,b) return a+b, a-b end

>=x(5,6) 11-1 11-1

> function x(a,b,c) return a..b..c end

>=x(a,b,c)

abc

Tắt nhiên chúng ta phải cân thận đối với đặt tên biến để không bị báo lỗi khi đang biên dịch hoặc lúc chạy chương trình như trong các ngôn ngữ kiểu thống kê. Tuy nhiên, điều này rất hữu dụng cho phép chúng ta viết code linh hoạt và đơn giản.

Một phần của tài liệu Tài liệu Giới thiệu về Lua - Lệnh gán ppt (Trang 25 - 26)