2013-09-08 25 views
8
function tell(num,...) 
    print("value of implicit table:",arg) 
    --print("value of implicit table:",...) 
    select(1,arg) 
    --select(1,...) 
end 
tell(12,43,12,55) 

Tại sao nó rằng việc sử dụng ... trong một biểu thức nguyên nhân giá trị của arg-
được nil ví dụ với print("value of implicit table:",...) hoặc select(1,...)?Tại sao việc sử dụng ... trong bất kỳ biểu thức nào trong một hàm gây ra giá trị của arg là nil trong Lua?

Trả lời

14

Lua 5.1 chính thức từ chối sử dụng bảng arg cho varargs, thích .... Tuy nhiên, có một tùy chọn biên dịch cho Lua, LUA_COMPAT_VARARG, cho phép sử dụng arg trong mã 5.1.

Nếu LUA_COMPAT_VARARG được định nghĩa khi Lua đã được biên soạn, một bảng arg sẽ được tạo trong varargs chức năng, và dân cư với các đối số - trừ khi trình biên dịch phát hiện việc sử dụng ... bên trong hàm. Trong trường hợp đó, nó giả định rằng bạn đang sử dụng varargs kiểu 5.1 thay vì 5.0, và không tạo bảng. Tuy nhiên, nó hiện, vẫn tạo địa phương có tên arg!

Kết quả cuối cùng của việc này là nếu LUA_COMPAT_VARARG được định nghĩa, chức năng vararg mà không sử dụng ... trong cơ thể có được một local arg chứa danh sách đối số, và các chức năng vararg rằng làm có được một local arg chứa nil. Lỗi này hiện diện trong tất cả các phiên bản 5.1 và có nghĩa là bạn không thể truy cập toàn cầu hoặc tăng giá trị có tên arg từ bất kỳ hàm vararg nào nếu LUA_COMPAT_VARARG được xác định tại thời gian biên dịch.

Lua 5.2 giọt hỗ trợ cho arg varargs kiểu hoàn toàn và do đó không có vấn đề này bất kể nó được cấu hình như thế nào tại thời gian biên dịch.

(Nguồn: những thay đổi trong varargs xử lý giữa 5.0 và 5.1, và LUA_COMPAT_VARARG tùy chọn, được đề cập trong the Lua 5.1 reference manual, section 7.1 Sổ tay ám chỉ bạn luaconf.h Các hành vi chính xác không được ghi nhận ở bất cứ đâu, theo như tôi biết.. , nó có thể được xác định bằng thực nghiệm, bằng cách đọc lparser.cldo.c hoặc từ các bài đăng trên danh sách gửi thư đã báo cáo ban đầu vấn đề này.)

+0

Được rồi, điều đó thật thú vị. Tôi đã thử nó với lua 5.2.0 và nhận được điều này: 'table: 00899618' như' args' value (xác nhận những gì bạn nói). Bởi "thời gian biên dịch", bạn có nghĩa là khi biên dịch trình thông dịch lua hoặc khi biên dịch một kịch bản lệnh lua bằng cách sử dụng 'luac.exe'. Làm sao người ta biết về các chi tiết như vậy? – Segfault

+0

@Segfault anh ta có nghĩa là khi trình thông dịch được xây dựng từ nguồn và một cái gì đó như '-DLUA_COMPAT_VARARG' được cung cấp cho trình biên dịch C, v.v. – greatwolf

+0

' -DLUA_COMPAT_ALL' nằm trong tệp makefile. Tôi đoán '_ALL' có nghĩa là' LUA_COMPAT_VARARG' được bao gồm. Thông tin này có trong tài liệu hay gì đó không? – Segfault

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