2012-02-27 30 views
14

Có thể tạo mô-đun Lua trả về nhiều kết quả thông qua hàm yêu cầu? Tôi hiện đang viết một phần mở rộng cho package.loaders và tôi muốn biết nếu tôi cần hỗ trợ hành vi đó.Chức năng yêu cầu của Lua có thể trả về nhiều kết quả không?

Ví dụ, đi mô-đun sau, tên mod.lua:

print("module loading") 
return "string1", "string2" 

Đó là yêu cầu của kịch bản sau đây:

print("running script") 
s1, s2 = require("mod") 
print("s1: " .. tostring(s1)) 
print("s2: " .. tostring(s2)) 

Kết quả trong đầu ra sau đây:

running script 
module loading 
s1: string1 
s2: nil 

Khi tôi mong đợi chuỗi thứ hai được trả về. Tôi không muốn sử dụng hành vi như vậy, và tôi nhận ra rằng bạn có thể tái tạo nó bằng cách trả về một bảng và giải nén nó, tôi chỉ muốn biết nếu nó có nghĩa là làm việc (vì nó là cú pháp Lua hợp lệ) và tôi không thể tìm thấy câu trả lời dứt khoát về điều này ở bất cứ đâu.

Trả lời

10

Lua 5.1.3
require lua xuất khẩu thực hiện trong static int ll_require (lua_State *L) trong loadlib.c tập tin. Hàm này luôn trả về 1 dưới dạng số giá trị trả về trên stack.

+1

Vâng, có vẻ theo cách đó nhìn vào nguồn (Tôi đang ở trên Lua 5.2 và nó có cùng giá trị trả về). Tôi đoán hạn chế là một phần vì nó lưu trữ kết quả trong '_LOADED [" mod "]' và nó sẽ không thể trả về nhiều giá trị từ đó mà không đóng gói chúng trong một bảng và giải nén chúng một lần nữa, không cần thiết trong hầu hết các trường hợp. – GooseSerbus

+1

@GooseSerbus Cũng vì 'require' thay đổi giá trị trả về. Nếu module trả về 'nil',' require' trả về 'true'. – finnw

8

Bạn luôn có thể trở lại một chức năng từ mô-đun của bạn và có mà trả lại nhiều giá trị, như dưới đây:

foo.lua

return function() return "abc", 123 end 

bar.lua

local a, b = require "foo"() 
Các vấn đề liên quan