2013-06-06 30 views
5

Tôi đã học Lua và tôi đã tự hỏi liệu nó có được phép tham chiếu hai biến cục bộ có cùng tên hay không.Lua - Hai biến cục bộ có cùng tên

Ví dụ: trong đoạn mã sau, cú pháp có hợp pháp (không có undefined behavior) không?

Tôi hỏi vì nó chạy, nhưng tôi dường như không thể tìm ra những gì đang diễn ra đằng sau hậu trường. Điều này chỉ đơn giản là tham chiếu cùng một địa chỉ x địa phương? Hoặc hiện có hai biến số local x làm mọi thứ lộn xộn phía sau hậu trường. Tôi muốn biết chính xác những gì đang xảy ra ở đây và tại sao nó là như vậy.

local x = 5 + 3; -- = 8 
local x = 3 - 2; -- = 1 

print("x = " .. x); -- x = 1 

Trả lời

7

Có hai biến. Các bóng thứ hai (nhưng không loại bỏ hoặc ghi đè) đầu tiên.

Đôi khi bạn vẫn có thể truy cập định nghĩa trước đó thông qua việc đóng.

local x = 5 + 3 
local function getX1() 
    return x 
end 
local x = 3 - 2 
local function getX2() 
    return x 
end 

print("x = " .. x); -- x = 1 
print("x = " .. getX1()); -- x = 8 
print("x = " .. getX2()); -- x = 1 
+0

dụ Rất rõ ràng. Thú vị và tốt để biết! Cảm ơn! – MrHappyAsthma

4

Có, nó là hợp pháp. Lua xử lý các tờ khai local có thể biến đổi thành statements.

Dưới đây là một ví dụ thú vị từ Lua Reference Manual:

Chú ý rằng mỗi thực hiện một tuyên bố địa phương xác định các biến cục bộ mới. Hãy xem xét ví dụ sau:

a = {} 
local x = 20 
for i=1,10 do 
    local y = 0 
    a[i] = function() y=y+1; return x+y end 
end 

Các vòng lặp tạo ra mười đóng cửa (có nghĩa là, mười trường hợp của hàm vô danh). Mỗi đóng này sử dụng một biến y khác nhau, trong khi tất cả chúng đều chia sẻ cùng một x.

Trong ví dụ này, nếu bỏ qua phần đóng cửa trở về, có 10 local biến có tên y trong cùng một khối for.

8

Tất cả các biến địa phương của bạn đã được nhớ đến bởi Lua :-)

local x = 5 + 3; -- = 8 
local x = 3 - 2; -- = 1 

local i = 0 
repeat 
    i = i + 1 
    local name, value = debug.getlocal(1, i) 
    if name == 'x' then 
     print(name..' = '..value) 
    end 
until not name 
+0

+1 cho kết quả có thể được nhìn thấy trong Lua –

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