2012-04-26 14 views
13

Cách thích hợp để thực hiện điều kiện kiểm tra thứ gì đó hoặc không trống trong Lua là gì? if x == ""f x ~= "" dường như không hoạt động.Cách kiểm tra xem một giá trị có trống trong Lua không?

+1

Làm thế nào để bạn xác định "trống"? –

+0

Ý nghĩa trống rỗng, không có gì được nhập vào nó. – Village

+2

Bạn không thể "nhập" các giá trị vào các biến. Bạn có thể đưa ra một định nghĩa chính xác hơn không? Vì một biến chứa chuỗi '" "' không phải là "rỗng". Nó có một chuỗi. Cụ thể là '" "'. Đó là một chuỗi hợp lệ. Và do đó không có gì. –

Trả lời

14

Lua là ngôn ngữ dựa trên kiểu động.
Bất kỳ biến có thể giữ một trong các loại sau đây: nil, boolean, số, chuỗi, bảng, chức năng, chủ đề, hoặc userdata.
Bất kỳ biến nào trong một bảng (bao gồm _G, bảng nơi hình cầu chung cư) mà không có giá trị cho một giá trị là nil khi được lập chỉ mục. Khi bạn đặt biến bảng thành nil, về cơ bản, nó "không khai báo" biến (xóa mục nhập khỏi bộ nhớ hoàn toàn).
Khi một biến số local được khai báo, nếu nó không được gán ngay lập tức, nó sẽ được gán giá trị nil. Không giống như biến bảng, khi bạn đặt biến số local thành nil, nó không không "undeclare" nó (nó chỉ có giá trị là nil).

Trong Lua, một chuỗi trống ("") vẫn là một "giá trị" - nó chỉ đơn giản là một chuỗi có kích thước bằng không.

+0

Tôi nghĩ rằng "_Khi bạn đặt biến thành nil, về cơ bản" undeclares "it_" là một bit không chính xác — 'nil' là giá trị đúng trừ bảng bên trong, ví dụ: biến cục bộ có giá trị' nil' các biến đổ bóng trong phạm vi xung quanh ... – snogglethorpe

+0

Bạn hoàn toàn đúng; tuyên bố đó là nhằm vào các cặp bảng, không phải ở tất cả các biến nói chung. Người trả lời đã được sửa đổi để phản ánh điều này. – Deco

+0

@snogglethorpe 'nếu bằng không thì \t print ("nil là true") khác \t print ("nil là không đúng!") end' -> nil là không đúng! – handle

1

Bạn có thể có dấu cách, dòng mới hoặc các ký tự không hiển thị khác trong chuỗi của mình. Vì vậy, bạn nghĩ rằng nó là "trống rỗng", nhưng nó không phải là. Điều này thường xảy ra khi bạn đang dùng đầu vào từ người dùng và phải nhập "enter" để kết thúc - "enter" kết thúc trong chuỗi.

Những gì bạn cần là một hàm cho bạn biết chuỗi có "trống" - trống hoặc danh sách khoảng trắng/tab/dòng mới. Dưới đây là một cách để làm điều đó:

function isBlank(x) 
    return not not tostring(x):find("^%s*$") 
end 

Cách sử dụng:

if isBlank(x) then 
    -- ... 
end 
+2

thats khá không hiệu quả; 'not not string.find (x," ^% s * $ ")' – daurnimator

+0

Vâng, phiên bản của bạn là dứt khoát (một khi bạn bao gồm cuộc gọi dây rút được gọi là ommited). Tôi không chắc nó nhanh hơn đáng kể. Tại sao bạn nghĩ rằng? – kikito

+0

'string.gsub' sẽ phân bổ rất nhiều bộ nhớ cho hoạt động đó (một chuỗi mới được thay đổi kích cỡ nhiều lần, một hoặc hai bộ đệm thay thế) so với' string.find'. – Deco

3

Gần đây tôi đã chạy qua vấn đề này là tốt. LuaSQL đã trả về các chuỗi trống nếu giá trị cơ sở dữ liệu là 'trống' (không phải là rỗng). Một cách tiếp cận hacky, nhưng đây là cách tôi đã giải quyết nó:

if (string.len(x) >= 1) then 
    ... 
end