2012-01-30 25 views
5

thể trùng lặp:
“main” function in Lua?Cách kiểm tra xem tập lệnh có được bao gồm thông qua dofile() hoặc chạy trực tiếp trong Lua không?

Trong Python, bạn có thể kiểm tra xem một kịch bản đã được gọi là direcly (và gọi một số chức năng nếu có, thường để thử nghiệm) khá dễ dàng:

if __name__ == "__main__": 
    main() 

Có cách nào để thực hiện tương tự trong Lua, để phát hiện xem nó có chạy trực tiếp hay không (lua foo.lua) hoặc được bao gồm trong một s khác cript (dofile('foo.lua')).

Luôn có cách xác định một số biến toàn cục giả trong tệp tập lệnh chính trước dofile('foo.lua') và kiểm tra trong foo.lua nếu nó được xác định hay không, nhưng sẽ tuyệt vời nếu có cách tốt hơn để làm điều này.

+0

Bạn nói đúng, xin lỗi vì sự trùng lặp ... – Wookai

Trả lời

7

Ở cấp độ đầu bạn có thể kiểm tra nếu debug.getinfo(2) là con số không

Từ http://www.lua.org/manual/5.1/manual.html#pdf-debug.getinfo

bạn có thể cho một số như giá trị của hàm số, có nghĩa là chức năng chạy ở chức năng mức độ các cuộc gọi stack của chuỗi đã cho: mức 0 là hàm hiện tại (chính bản thân getinfo); mức 1 là hàm gọi là getinfo; và vân vân. Nếu hàm là một số lớn hơn số hàm hoạt động, thì hàm getinfo trả về nil.

+0

Điều này cũng sẽ trả về 'true' cho bất kỳ hàm nào chạy trực tiếp từ mã nhúng. –

+0

đó là những gì tôi giả định OP được kiểm tra effectivly: nếu kịch bản này được gọi trực tiếp (hoặc nếu được tải thông qua yêu cầu/dofile/loadfile/loadstring/etc) – daurnimator

+0

Tôi đang sử dụng 5.2.3, và có vẻ như tôi cần phải kiểm tra 'debug .getinfo (3) 'thay vì' 2'. – dimo414

2

Không. Lua không có cách nào để biết tập lệnh có được gọi trực tiếp hay không.

Hãy nhớ rằng: Lua và Python tồn tại cho các mục đích khác nhau. Python được thiết kế cho kịch bản lệnh dòng lệnh. Bạn viết một kịch bản lệnh gọi các mô-đun có thể được viết bằng Python, C++ hoặc bất kỳ thứ gì. Kịch bản Python là cuối cùng những gì là phụ trách của mã được gọi là khi nào.

Lua là nhúng ngôn ngữ kịch bản, trước tiên và quan trọng nhất. Trong khi bạn chắc chắn có thể sử dụng trình thông dịch độc lập lua.exe để tạo các tập lệnh dòng lệnh, đó là một thứ gì đó của một kludge. Mục đích chính của ngôn ngữ là được nhúng vào trong một số ứng dụng được viết bằng C, C++ hoặc bất kỳ thứ gì.

Vì lý do này, có không có khái niệm là về tập lệnh "chính". Làm thế nào bạn sẽ xác định những gì là "chính" và những gì không? Nếu mã C có thể tải bất kỳ tập lệnh nào vào bất kỳ lúc nào, cho bất kỳ mục đích nào, mã nào trong số đó là "chính"?

Nếu bạn muốn xác định khái niệm này, nó khá đơn giản. Chỉ cần dính này ở phía trên cùng của "chính" của bạn kịch bản:

do 
    local old_dofile = dofile 
    function new_dofile(...) 
    if(__is_main) then 
     __is_main = __is_main + 1 
    else 
     __is_main = 1 
    end 
    old_dofile(...) 
    __is_main = __is_main - 1 
    if(__is_main == 0) then __is_main = nil end 
    end 
    dofile = new_dofile 
end 

Cấp, điều này sẽ không làm việc cho bất cứ điều gì nạp với require; bạn cũng cần phải viết phiên bản này cho require. Và nó chắc chắn sẽ không hoạt động nếu mã bên ngoài sử dụng chức năng tải C-API (đó là lý do tại sao require có thể sẽ không hoạt động).

+0

Bất kỳ lý do nào cho -1? –

+0

Tôi đã không downvote bạn, nhưng tôi đoán gọi một kludge bất kỳ cách sử dụng của Lua nhưng nhúng có thể là lý do.Tôi đồng ý rằng nó thực sự tỏa sáng khi được nhúng, nó cũng rất hữu dụng như một ngôn ngữ kịch bản. – Wookai

Các vấn đề liên quan