快速體驗,學習lua(一種可嵌入c++,c#,android,object-c等並進行互調支持熱更新的腳本)的入門調試系列(2)

--這裏是註釋
--[[
功能備註: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");
相關文章
相關標籤/搜索