從一個簡單示例開始
假設一個c語言程序要畫一個窗口界面,窗口的長和寬可以由用戶指定。要實現這個功能還有另外更簡單的方法,例如使用環境變量或只包含(key, value)形式的普通文本文件,但是如果使用普通文本文件你還是需要對其進行解析。程序的配置文件如下(conf.lua):
--configuration file
--to define window_size
width = 200
height = 300
下面的代碼演示瞭如何用lua提供的接口來獲得這兩個全局變量的值:
程序首先通過函數luaL_newstate()
創建一個lua狀態,繼而用luaL_openlibs()
將函數庫添加到狀態中;然後使用函數
加載並解析lua文件,完成後使用lua_pcall()
執行配置文件中的語句。函數
將lua文件中名爲name
的全局變量的值放入棧中。如果變量name
不存在,lua會向棧中放入一個nil
值。然後使用lua_isnumber()
判斷獲取的內容是否是數值,如果是的話就將其轉換成c語言對應的類型。對於lua棧,有如下的解釋:
lua 解釋器使用一個棧接口來與調用代碼通信。由c代碼將發送到lua代碼的數據push到棧上;lua 解釋器返回的響應也被push到棧上。如果傳遞給luaL_loadbuffer()
的代碼有錯誤,則錯誤消息被push到棧上。棧上的項有類型和值。lua_type()
函數查詢一個對象的類型;lua_to<type>()
函數(例如 lua_tostring())產生被強制轉換成特定c類型的值。用lua編寫的代碼總是嚴格遵從棧模型;但是,c代碼則可以探查棧的其餘部分,甚至可以在棧中插入值。這種接口雖然簡單,但是其功能出奇強大。待執行的代碼都被同等對待;首先被 push 到棧上,然後等待lua_pcall()
函數來執行它。
上面這個例子很簡單,只是用來說明lua的用法,實現這個功能可以使用其它更簡單的方法。但是使用lua作爲配置文件還有更強大的地方,例如可以使用註釋,還可以根據環境變量來作出不同的選擇,就像這樣: