--这里是注释
--[[
功能备注:lua快速体验,学习,了解语法(数组,表,元表,操作符)
创建时间:2020-6-27
创建人:pcw
--]]
print("--------------------------------");
--【数组】
array1={"中国","美国","德国","日本"};
for i=1,table.getn(array1) do --table.getn就是获得表,数组的长度
print("数组元素",array1[i])
end
array2={};
for i=-2,table.getn(array2) do --虽然数组索引默认从1开始,但也可以指定负数或0开始
array2[i]=i*2;
print(array2[i]);
end
print("--------------------------------");
--【二维数组基础上打印乘法口诀表】
array3={};
for i3=1,9 do
array3[i3]={};
for j3=1,i3 do
array3[i3][j3]=i3*j3;
end
end
strResult3="";
for i3=1,table.getn(array3) do
for j3=1,table.getn(array3[i3]) do
strResult3=strResult3..i3.."*"..j3.."="..array3[i3][j3].." ";
end
strResult3=strResult3.."\r\n";
end
print(strResult3); --证明lua中的二维数组是参差数组,
print(array3[1][5]);--不存在的元素,值是nil
print("--------------------------------");
--【table的常用操作】
table4={"k1","a2","d5","b","222"};
for k,v in ipairs(table4) do
print(k,v);
end
table.sort(table4);--集合排序
for k,v in ipairs(table4) do
print(k,v);
end
print("--------------------------------");
--【元表:元表是表】--__index 可以是表也可以是函数
print("关于元表:元表是表");
normaltable={white=100};
_index_Table={green=212};
metatable={__index=_index_Table};
tableSetMetatable=setmetatable(normaltable,metatable);
print("tableSetMetatable.white=",tableSetMetatable.white);
print("tableSetMetatable.green=",tableSetMetatable.green);
print("tableSetMetatable.red",tableSetMetatable.red);
--[[
输出结果:
关于元表
tableSetMetatable.white= 100
tableSetMetatable.green= 212
tableSetMetatable.red nil
]]
print("--------------------------------");
--【元表:元表是函数】--__index 可以是表也可以是函数
print("关于元表:元表是函数");
tableAsFunForMetatable=setmetatable(
{cn="棒棒的,5000年历史的伟大的国家"},
{
__index=function(tableAsFunForMetatable,key)
if key=="usa" then
return "美国:帝国,霸权主义,资本吸血鬼";
elseif key=="jp" then
return "日本: 不好好反省二战的罪行. 需要提防";
else
return nil;
end
end
})
print("tableAsFunForMetatable.cn=",tableAsFunForMetatable.cn);
print("tableAsFunForMetatable.usa=",tableAsFunForMetatable.usa);
print("tableAsFunForMetatable.jp",tableAsFunForMetatable.jp);
print("tableAsFunForMetatable.au",tableAsFunForMetatable.au);
print("--------------------------------");
--【元表:元表中的__newindex元方法】--__newindex (存在的key则不赋值给表,只更新元表。 存在的则更新表而不更新元表)
print("关于元表:元表中的__newindex方法");
metatableForNewIndex={};
tableForTestNewINdex=setmetatable({k1="v1"},
{__newindex=metatableForNewIndex});
print("tableForTestNewINdex.k1=",tableForTestNewINdex.k1);
tableForTestNewINdex.k2="v2";
print(tableForTestNewINdex.k2,metatableForNewIndex.k2);
tableForTestNewINdex.k1="v1_newvalue";
print(tableForTestNewINdex.k1,metatableForNewIndex.k1);
--[[
输出结果:
关于元表:__newindex 注:存在的key则不赋值给表,只更新元表。 存在的则更新表而不更新元表
tableForTestNewINdex.k1= v1
nil v2
v1_newvalue nil
]]
print("--------------------------------");
--【元表:元表中的__newindex元方法,引入rawset支持更新-__newindex (存在的key则不赋值给表,只更新元表。 存在的则更新表而不更新元表)
print("元表:元表中的__newindex元方法,引入rawset支持更新-__newindex");
tableForTestNewINdex2=setmetatable({k1="v1"},
{__newindex=function(tableForTestNewINdex2,key,value)
rawset(tableForTestNewINdex2,key,"\""..value.."\"");
end
});
print("tableForTestNewINdex2.k1=",tableForTestNewINdex2.k1);
tableForTestNewINdex2.k2="v2";
print(tableForTestNewINdex2.k2,tableForTestNewINdex2.k2);
tableForTestNewINdex2.k1="v1_newvalue";
print(tableForTestNewINdex2.k1,tableForTestNewINdex2.k1);
--[[
输出结果:
关于元表:__newindex 注:存在的key则不赋值给表,只更新元表。 存在的则更新表而不更新元表
tableForTestNewINdex.k1= v1
nil v2
v1_newvalue nil
]]
print("--------------------------------");
print("元表:添加表运算符 ,table之间相减(添加__sub元方法) ");
function tb_maxn(t) --table.maxn在lua5.2以上已废除
local max=0;
for k,v in pairs(t) do
if(k>max) then
max=k;
end
end
return max;
end
function tb_getIndexByKey(t,skey) --table.maxn在lua5.2以上已废除
local index=0;
for k,v in pairs(t) do --对于非键值对的,k是从1开始的序号,v是元素?
index=index+1;
if(v==skey) then
return index;
end
end
return 0;
end
tableForTestSub=setmetatable(
{"cn","usa","en","jp","ru","ge"},
{
__sub=function(tableForTestSub,newtable)
local indexOfDelete=0;
for k,v in pairs(newtable) do
indexOfDelete=tb_getIndexByKey(tableForTestSub,v);
if(indexOfDelete>0) then
table.remove(tableForTestSub,indexOfDelete);
end
end
return tableForTestSub;
end
});
print(tb_getIndexByKey(tableForTestSub,"jp"));
print("全部国家(tableForTestSub)");
for k,v in pairs(tableForTestSub) do
print(k,v);
end
secondtable={"usa","jp"};
print("有野心,搞霸权的国家(secondtable)");
for k,v in pairs(secondtable) do
print(k,v);
end
tableForTestSub=tableForTestSub-secondtable;
print("对中国比较友好的国家(tableForTestSub=tableForTestSub-secondtable)");
for k,v in pairs(tableForTestSub) do
print(k,v);
end
print("--------------------------------");
print("元表:__call元方法");
tableForTestCall=setmetatable(
{"cn","usa","en","jp","ru","ge"},
{
__call=function(tableForTestCall,newtable)
local indexOfDelete=0;
for k,v in pairs(newtable) do
indexOfDelete=tb_getIndexByKey(tableForTestCall,v);
if(indexOfDelete>0) then
table.remove(tableForTestCall,indexOfDelete);
end
end
return tableForTestCall;
end
});
secondtableForCall={"usa"};
tableForTestCall=tableForTestCall(secondtableForCall)
print("支援中国抗疫的国家:");
for k,v in pairs(tableForTestCall) do
print(k,v);
end
--[[
输出结果:
1 cn
2 en
3 jp
4 ru
5 ge
]]
print("--------------------------------");
print("元表:__tostring元方法");
tableForTestToString=setmetatable(
{"cn","usa","en","jp","ru","ge"},
{
__tostring=function(tableForTestToString)
explainStr="";
for k,v in pairs(tableForTestToString) do
explainStr=explainStr..v..",";
end
return explainStr;
end
});
print(tableForTestToString);
--[[
输出结果:
cn,usa,en,jp,ru,ge,
]]
print("--------------------------------");
print("尝试读取文件");
function readFileContent(sFile)
-- 以只读方式打开文件
file = io.open(sFile, "r")
-- 设置默认输入文件为 test.lua
io.input(file)
-- 输出文件第一行
sResult=io.read();
-- 关闭打开的文件
io.close(file);
return sResult;
end
print("尝试读取文件readFileContent(\"fileRead.txt\")");
print(readFileContent("fileRead.txt"));
--[[
输出:nihao,这里从文件读出来的
]]
print("尝试读取文件pcall(readFileContent,exceptionProcess2,\"fileRead.txt\"");
xpcall(readFileContent,exceptionProcess2,"fileRead.txt");--这里为什么出错
--[[
stack traceback:
configlab.lua:120: in function <configlab.lua:119>
[C]: in function 'open'
configlab.lua:141: in function <configlab.lua:139>
[C]: in function 'xpcall'
configlab.lua:152: in main chunk
[C]: ?
]]
function writeFileContentByAppend(sFile)
-- 以附加的方式打开只写文件
file = io.open(sFile, "a");
-- 设置默认输入文件为 test.lua
io.output(file);
-- 输出文件第一行
io.write("--write by lua");
-- 关闭打开的文件
io.close(file);
end
print("尝试写入文件");
writeFileContentByAppend("fileRead.txt");