# 非空判斷
大家在使用Lua的時候,一定會遇到不少和nil有關的坑吧。有時候不小心引用了一個沒有賦值的變量,這時它的值默認為nil。如果對一個nil進行索引的話,會導致異常。如下:
~~~
local person = {name = "Bob", sex = "M"}
-- do something
person = nil
-- do something
print(person.name)
~~~
上面這個例子把nil的錯誤用法顯而易見地展示出來,執行后,會提示這樣的錯誤:
~~~
stdin:1:attempt to index global 'person' (a nil value)
stack traceback:
stdin:1: in main chunk
[C]: ?
~~~
然而,在實際的工程代碼中,我們很難這么輕易地發現我們引用了nil變量。因此,在很多情況下我們在訪問一些table型變量時,需要先判斷該變量是否為nil,例如將上面的代碼改成:
~~~
local person = {name = "Bob", sex = "M"}
-- do something
person = nil
-- do something
if (person ~= nil and person.name ~= nil) then
print(person.name)
else
-- do something
end
~~~
對于簡單類型的變量,我們可以用 _if (var == nil) then_ 這樣的簡單句子來判斷。但是對于table型的Lua對象,就不能這么簡單判斷它是否為空了。一個table型變量的值可能是{},這時它不等于nil。我們來看下面這段代碼:
~~~
local a = {}
local b = {name = "Bob", sex = "Male"}
local c = {"Male", "Female"}
local d = nil
print(#a)
print(#b)
print(#c)
--print(#d) -- error
if a == nil then
print("a == nil")
end
if b == nil then
print("b == nil")
end
if c== nil then
print("c == nil")
end
if d== nil then
print("d == nil")
end
if _G.next(a) == nil then
print("_G.next(a) == nil")
end
if _G.next(b) == nil then
print("_G.next(b) == nil")
end
if _G.next(c) == nil then
print("_G.next(c) == nil")
end
-- error
--if _G.next(d) == nil then
-- print("_G.next(d) == nil")
--end
~~~
返回的結果如下:
~~~
0
0
2
d == nil
_G.next(a) == nil
~~~
因此,我們要判斷一個table是否為{},不能采用#table == 0的方式來判斷。可以用下面這樣的方法來判斷:
~~~
function isTableEmpty(t)
if t == nil or _G.next(t) == nil then
return true
else
return false
end
end
~~~
- 序
- Lua簡介
- Lua環境搭建
- 基礎數據類型
- 表達式
- 控制結構
- if/else
- while
- repeat
- 控制結構for的使用
- break,return
- Lua函數
- 函數的定義
- 函數的參數
- 函數的返回值
- 函數回調
- 模塊
- String庫
- Table庫
- 日期時間函數
- 數學庫函數
- 文件操作
- 元表
- 面向對象編程
- FFI
- LuaRestyRedisLibrary
- select+set_keepalive組合操作引起的數據讀寫錯誤
- redis接口的二次封裝(簡化建連、拆連等細節)
- redis接口的二次封裝(發布訂閱)
- pipeline壓縮請求數量
- script壓縮復雜請求
- LuaCjsonLibrary
- json解析的異常捕獲
- 稀疏數組
- 空table編碼為array還是object
- 跨平臺的庫選擇
- PostgresNginxModule
- 調用方式簡介
- 不支持事務
- 超時
- 健康監測
- SQL注入
- LuaNginxModule
- 執行階段概念
- 正確的記錄日志
- 熱裝載代碼
- 阻塞操作
- 緩存
- sleep
- 定時任務
- 禁止某些終端訪問
- 請求返回后繼續執行
- 調試
- 調用其他C函數動態庫
- 我的lua代碼需要調優么
- 變量的共享范圍
- 動態限速
- shared.dict 非隊列性質
- 如何添加自己的lua api
- 正確使用長鏈接
- 如何引用第三方resty庫
- 使用動態DNS來完成HTTP請求
- 緩存失效風暴
- Lua
- 下標從1開始
- 局部變量
- 判斷數組大小
- 非空判斷
- 正則表達式
- 不用標準庫
- 虛變量
- 函數在調用代碼前定義
- 抵制使用module()函數來定義Lua模塊
- 點號與冒號操作符的區別
- 測試
- 單元測試
- API測試
- 性能測試
- 持續集成
- 灰度發布
- web服務
- API的設計
- 數據合法性檢測
- 協議無痛升級
- 代碼規范
- 連接池
- c10k編程
- TIME_WAIT問題
- 與Docker使用的網絡瓶頸
- 火焰圖
- 什么時候使用
- 顯示的是什么
- 如何安裝火焰圖生成工具
- 如何定位問題