Lua 任意型別的get set方法

2021-08-10 21:50:20 字數 1798 閱讀 9834

對於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...