對於lua與c程式相互呼叫時,如果有乙個數字需要在c程式和lua指令碼同時使用,這時就需要保持lua程式與c程式中的數字變數一致,及當c程式改變了這個數字變數時lua能夠獲取改變後的值,當lua程式改變了變數時c程式也可以獲取改變後的值。實現這個功能可以給lua變數設定get/set方法。當lua中讀取數字變數的值時,則呼叫對應得get方法,get方法中可以呼叫c程式中的乙個get獲取到c程式中數字變數的值,同理給數字變數賦值時也一樣。這樣lua中使用的數字變數的值就是c程式中的變數值,從而保持一直。
lua本身並沒有提供get/set類的方法,但可以通過環境表元表的__index和__newindex方法實現。當獲取乙個global變數時,實際上是通過變數名為索引從環境表中獲取值,如果環境表中沒有變數時會去呼叫相應的__index方法。所以要實現get/set方法可以將變數存於另乙個表,在環境表中不儲存相應的變數,在環境表的__index方法中根據變數去查詢並呼叫相應的get/set方法。具體實現如下。
function attr_setup()
local handlers = {} --儲存get和set方法
local values = {} --儲存值
local mt =
endend,
}setmetatable(getfenv(), mt)--將當前環境的元表設為 mt,getfenv()只使用於lua5.1以前的版本,5.2以後請使用_env 變數
endattr_setup()
print(c) -->nil
print(type(c), "\n\n") -->nil
a = 15
print(a) -->15
print(type(a), "\n\n")--number
b = ;
print(b.x) -->10
print(type(b), "\n\n")-->table
print("rawget(_g, \'b\')", rawget(_g, 'b')) -->nil
c**
#includeextern "c"
using namespace std;
const char *handlesgetset = "handlesgetset";
double a = 166;
int a_get(lua_state*l)
int a_set(lua_state *l)
return 0;
}int index_event(lua_state*l)
else
return 1;
}int newindex_event(lua_state *l)
else
return 0;
}int main()
printf("a = %f\n\n\n", a);
a = a+1000;
if (0 != lual_dofile(l, "a.lua"))
printf("a = %f\n", a);
lua_close(l);
return 0;
}
測試用的 「a.lua」檔案
print(a)
a = a+1
print("c=", c)
b = "adas"
print("b=", b)
執行結果:
lua中的table型別
lua中的table型別確實很靈活,靈活到大家發揮想象力,隨意發揮 lua中的表太強大了 t t.a 111 t b 222 t 3 bbb t.t 定義乙個函式 function t.fun p io.write n這是第乙個函式!p endt.fun2 function a,b io.write...
lua中的string型別
在lua中用union tstring來表示字串型別 其中結構體tsv中 reserved欄位表示字串是不是保留關鍵字,hash是其雜湊值,len是其長度。我們在tstring中沒有看到lua將字串的內容存在任何地方啊,其實lua是將內容同一存在了另乙個地方,global state中的strt裡面...
Python之任意階幻方的構造
本文在用python構造任意階幻方的時候,參考的資料如下 維基百科 幻方 由矩陣構造奇數階幻方的方法,高建國,河南大學學報 python 如下 具體的構造方法可參看以上資料 coding utf 8 利用numpy模組構造幻方 import numpy as np 列表迴圈向左移offset位 de...