天天看點

[Lua]lua初識

<code>-- mac 上有很多文本編輯器,Himi找了很多,感覺TextMate是比較好用的,小巧且功能強大!而且免費,圖示是個小菊花 - -</code>

<code>-- 注釋語句</code>

<code>--[[ </code>

<code>注釋段落語句</code>

<code>  </code><code>]]</code><code>--</code>

<code>--引用其他lua檔案,不需要加上(.lua)字尾</code>

<code>--require "xx"</code>

<code>--變量不需要定義,可以直接指派</code>

<code>count</code><code>=</code> <code>100</code>  <code>--成員變量</code>

<code>local</code> <code>count</code><code>=</code><code>100</code>  <code>--局部變量</code>

<code>--方法定義</code>

<code>function hello</code><code>(</code><code>...</code><code>)</code>

<code>    </code><code>--列印</code>

<code>    </code><code>print</code><code>(</code><code>"Hello Lua!"</code><code>)</code><code>;</code>

<code>    </code><code>print</code><code>(</code><code>string</code><code>.format</code><code>(</code><code>...</code><code>)</code><code>)</code>

<code>end</code>

<code>-- 每一行代碼不需要使用分隔符,當然也可以加上</code>

<code>-- 通路沒有初始化的變量,lua預設傳回nil</code>

<code>-- 調用函數形式</code>

<code>hello</code><code>(</code><code>"你懂的"</code><code>)</code>

<code>--列印變量的類型</code>

<code>isOK</code><code>=</code><code>false</code>

<code>print</code><code>(</code><code>type</code><code>(</code><code>isOK</code><code>)</code><code>)</code>

<code>-- 基本變量類型</code>

<code>a</code><code>=</code><code>nil</code><code>--Lua 中值為nil 相當于删除</code>

<code>b</code><code>=</code><code>10</code>

<code>c</code><code>=</code><code>10.4</code>

<code>d</code><code>=</code><code>false</code>

<code>--定義字元串,單引号,雙引号都可以的</code>

<code>e</code><code>=</code><code>"i am"</code>

<code>d</code><code>=</code><code>'himi'</code>

<code>--兩個字元串的連接配接可以如下形式</code>

<code>stringA</code><code>=</code><code>"Hi"</code>

<code>stringB</code><code>=</code><code>"mi"</code>

<code>print</code><code>(</code><code>stringA..stringB</code><code>)</code>

<code>--另外Lua也支援轉移字元,如下</code>

<code>print</code><code>(</code><code>stringA..</code><code>"\n"</code><code>..stringB</code><code>)</code><code>;</code>

<code>--修改字元串的部分gsub,可以如下形式:(将stringA字元串中的Hi修改為WT)</code>

<code>stringA</code><code>=</code><code>string</code><code>.gsub</code><code>(</code><code>stringA</code><code>,</code><code>"Hi"</code><code>,</code><code>"WT"</code><code>)</code>

<code>print</code><code>(</code><code>stringA</code><code>)</code><code>;</code>

<code>--将字元換成數字tonumber(不轉也會自動轉)</code>

<code>--将數字換成字元tostring(不轉也會自動轉)</code>

<code>stringC</code><code>=</code> <code>"100"</code>

<code>stringC</code><code>=</code> <code>tonumber</code><code>(</code><code>stringC</code><code>)</code>

<code>stringC</code><code>=</code> <code>stringC</code><code>+</code><code>20</code>

<code>stringC</code><code>=</code> <code>tostring</code><code>(</code><code>stringC</code><code>)</code>

<code>print</code><code>(</code><code>stringC</code><code>)</code>

<code>--取一個字元串的長度使用 #</code>

<code>print</code><code>(</code><code>#stringC)</code>

<code>--建立 表</code>

<code>tableA</code><code>=</code><code>{</code><code>}</code>

<code>m</code><code>=</code> <code>"x"</code>

<code>tableA[m]</code><code>=</code><code>100</code>

<code>m</code><code>2</code> <code>=</code><code>'y'</code>

<code>tableA[m</code><code>2</code><code>]</code><code>=</code><code>200</code>

<code>print</code><code>(</code><code>tableA[</code><code>"x"</code><code>]..</code><code>"\n"</code><code>..tableA.y</code><code>)</code>

<code>--另外表還可以如下形式(從1開始)</code>

<code>tableB</code><code>=</code><code>{</code><code>"4"</code><code>,</code><code>"5"</code><code>,</code><code>"6"</code><code>,</code><code>"7"</code><code>,</code><code>"8"</code><code>}</code>

<code>print</code><code>(</code><code>tableB[</code><code>1</code><code>]</code><code>)</code>

<code>--算術操作符</code>

<code>c</code><code>1</code> <code>=</code> <code>10</code><code>+</code><code>2</code>

<code>c</code><code>2</code> <code>=</code> <code>10</code><code>-2</code>

<code>c</code><code>3</code> <code>=</code> <code>10</code><code>*</code><code>2</code>

<code>c</code><code>4</code> <code>=</code> <code>10</code><code>/</code><code>2</code>

<code>c</code><code>5</code> <code>=</code> <code>10</code><code>^</code><code>2</code>

<code>c</code><code>6</code> <code>=</code> <code>10</code><code>%</code><code>2</code>

<code>c</code><code>7</code> <code>=</code> <code>-10</code><code>+</code><code>2</code>

<code>print</code><code>(</code><code>c</code><code>1.</code><code>.</code><code>"_"</code><code>..c</code><code>2.</code><code>.</code><code>"_"</code><code>..c</code><code>3.</code><code>.</code><code>"_"</code><code>..c</code><code>4.</code><code>.</code><code>"_"</code><code>..c</code><code>5.</code><code>.</code><code>"_"</code><code>..c</code><code>6.</code><code>.</code><code>"_"</code><code>..c</code><code>7</code><code>)</code>

<code>--控制操作</code>

<code>--if then elseif then else end</code>

<code>abc</code><code>=</code><code>10</code>

<code>if</code>  <code>abc</code><code>=</code><code>=</code><code>10</code> <code>then</code>

<code>    </code><code>print</code><code>(</code><code>"v1"</code><code>)</code>

<code>elseif abc</code><code>=</code><code>=</code> <code>9</code> <code>then</code>

<code>    </code><code>print</code><code>(</code><code>"v2"</code><code>)</code>

<code>else</code>

<code>    </code><code>print</code><code>(</code><code>"v3"</code><code>)</code>

<code>--for</code>

<code>--從4(第一個參數)漲到10(第二個參數),每次增長以2(第三個參數)為機關</code>

<code>for</code> <code>i</code><code>=</code><code>4</code><code>,</code><code>10</code><code>,</code><code>2</code> <code>do</code>

<code>    </code><code>print</code><code>(</code><code>"for1:"</code><code>..i</code><code>+</code><code>1</code><code>)</code>

<code>--也可以不制定最後一個參數,預設1的增長速度</code>

<code>for</code> <code>i</code><code>=</code><code>4</code><code>,</code><code>10</code> <code>do</code>

<code>    </code><code>print</code><code>(</code><code>"for2:"</code><code>..i</code><code>+</code><code>1</code><code>)</code>

<code>tableFor</code><code>=</code> <code>{</code><code>"himi1"</code><code>,</code><code>"himi2"</code><code>,</code><code>"himi3"</code><code>,</code><code>"himi4"</code><code>,</code><code>"himi5"</code><code>}</code>

<code>for</code> <code>k</code><code>,</code><code>v</code><code>in</code> <code>pairs</code><code>(</code><code>tableFor</code><code>)</code> <code>do</code>

<code>    </code><code>print</code><code>(</code><code>"for3:key:"</code><code>..k..</code><code>"value:"</code><code>..v</code><code>)</code>

<code>--while</code>

<code>w</code><code>1</code> <code>=</code> <code>20</code>

<code>while</code><code>true</code> <code>do</code>

<code>    </code><code>w</code><code>1</code><code>=</code><code>w</code><code>1</code><code>+</code><code>1</code>

<code>    </code><code>if</code> <code>w</code><code>1</code> <code>=</code><code>=</code><code>25</code> <code>then</code>

<code>        </code><code>break</code>

<code>    </code><code>end</code>

<code>print</code><code>(</code><code>"whlile:"</code><code>..w</code><code>1</code><code>)</code>

<code>--repeat</code>

<code>    </code><code>aa</code><code>=</code><code>20</code>

<code>    </code><code>repeat</code> <code>aa</code><code>=</code> <code>aa</code><code>+</code><code>2</code>

<code>        </code><code>print</code><code>(</code><code>"repeat:"</code><code>..aa</code><code>)</code>

<code>    </code><code>until aa</code><code>&gt;</code><code>28</code>

<code>--關系操作符</code>

<code>--需要注意的是不等于符号 ~=  而不是!=</code>

<code>ax</code><code>=</code><code>10</code>

<code>bx</code><code>=</code><code>20</code>

<code>if</code> <code>ax</code><code>&gt;</code><code>bx</code><code>then</code>

<code>    </code><code>print</code><code>(</code><code>"GX1"</code><code>)</code>

<code>elseif ax</code><code>&lt;</code><code>bx</code><code>then</code>

<code>    </code><code>print</code><code>(</code><code>"GX2"</code><code>)</code>

<code>elseif ax</code><code>&gt;</code><code>=</code><code>bx</code><code>then</code>

<code>    </code><code>print</code><code>(</code><code>"GX3"</code><code>)</code>

<code>elseif ax</code><code>&lt;</code><code>=</code><code>bx</code><code>then</code>

<code>    </code><code>print</code><code>(</code><code>"GX4"</code><code>)</code>

<code>elseif ax</code><code>=</code><code>=</code><code>bx</code><code>then</code>

<code>    </code><code>print</code><code>(</code><code>"GX5"</code><code>)</code>

<code>elseif ax~</code><code>=</code><code>bx</code><code>then</code>

<code>    </code><code>print</code><code>(</code><code>"GX6"</code><code>)</code>

<code>    </code><code>print</code><code>(</code><code>"GX7"</code><code>)</code>

關于函數

<code>--函數詳解</code>

<code>--有一個傳回值的函數</code>

<code>function funTestBackOne</code><code>(</code><code>aCount</code><code>)</code>

<code>    </code><code>local</code> <code>aCount</code><code>=</code> <code>aCount</code><code>+</code><code>1</code>

<code>    </code><code>return</code> <code>aCount</code>

<code>a</code><code>=</code><code>20</code>

<code>print</code><code>(</code><code>funTestBackOne</code><code>(</code><code>a</code><code>)</code><code>)</code>

<code>--有多個傳回值的函數</code>

<code>function funTestBackMore</code><code>(</code><code>)</code>

<code>    </code><code>return</code> <code>2</code><code>,</code><code>3</code>

<code>a</code><code>,</code><code>b</code><code>=</code><code>funTestBackMore</code><code>(</code><code>)</code>

<code>print</code><code>(</code><code>a..</code><code>" and "</code><code>..b</code><code>)</code>

<code>--有變長參數的函數</code>

<code>function funTestUnKnow</code><code>(</code> <code>...</code><code>)</code>

<code>    </code><code>print</code><code>(</code><code>...</code><code>)</code>

<code>funTestUnKnow</code><code>(</code><code>a</code><code>,</code><code>b</code><code>,</code><code>"Himi"</code><code>)</code>

<code>--閉合函數(一個函數寫在另外一個函數内)</code>

<code>function funTest</code><code>1</code><code>(</code> <code>...</code><code>)</code>

<code>    </code><code>local</code> <code>d</code><code>=</code> <code>12</code><code>;</code>

<code>    </code><code>d</code><code>=</code><code>d</code><code>+</code><code>...</code>

<code>    </code><code>function funTest</code><code>2</code><code>(</code> <code>...</code><code>)</code>

<code>        </code><code>print</code><code>(</code><code>d</code><code>)</code>

<code>    </code><code>funTest</code><code>2</code><code>(</code><code>)</code>

<code>funTest</code><code>1</code><code>(</code><code>100</code><code>)</code>

day1

--[[function fuc(n)

if n==0 then

return 1

else

return n*fuc(n-1)

end

print("input a number")

a = io.read("*number")

print(fuc(a))

--]]

--替換字元串

--[[

a = "one thing"

b = string.gsub(a,"one","two")

print(a)

print(b)

--轉換數字

line = io.read()

n = tonumber(line)

if n==nil then

error(line.."is not a valid number")

print(n*2)

--拼接字元串

print("10"+1)

print("hell".."o")

--轉換

print(n)

print("我是一個字元串"..tostring(n))

print("10"=="10")

print(tostring(10)=="10")

--#計算長度

a = "hello"

print(#a)

print(#"good\0byte")

]]--

--table的使用

a = {}

k = "x"

a[k] = 10

a[20] = "great"

print(a[k])

print(a[20])

k = 20

a["x"] =a["x"]+1

print(a["x"])

--使用同一個table

a["x"] = 10

b = a --a和b使用了同一個table

print(b["x"])

b["x"] = 20

a = nil --b還在用table

b = nil --沒人用table了

--自動增長

--建立1000個新條目

for i = 1,1000 do a[i] = i*2 end

print(a[9])

print(a["y"])

a.x = 20

print(a.x)

--循環存儲值

for i = 1,10

do a[i] = io.read() end

--輸入列印數組的值

for i = 1,#a do

print(a[i])

--輸出最後一個值

print(a[#a])

a[#a] = nil --删除最後一個值

a[#a + 1] = v --将v添加到清單的末尾

a[1000] = 10

a[10000] = 11

print(table.maxn(a))

i = 10;j = "10";k = "+10"

a[i] = "one value"

a[j] = "another value"

a[k] = "yet another value"

print(a[j])

print(a[tonumber(j)])

print(a[tonumber(k)])

--取小數點後面幾位

x = math.pi

print(x%0.1)

print(x - x%0.01)

local tolerance = 10

function isturnback(angle)

angle = angle%360

return (math.abs(angle-180)&lt;tolerance)

print(isturnback(-180))

a = 10

b = "10"

if tostring(a)~=b then print("不等")

print("相等")

a.x = 1

a.y = 2

b = {}

b.x = 1

b.y = 2

c = a --a 等于 c table隻有兩個變量引用同一個的時候才是相等的

if a==b then print("a==b")

print("a~=b")

days = {"Sunday","Monday","Tuesday","Wednessday","Thursday","Friday","Saturday"}

print(days[1]) --這裡注意不是從0開始

--a={x = 10,y = 20} &lt;=&gt;a = {};a.x = 10;a.y = 20

w = {x = 0,y = 0, label = "console"}

x = {math.sin(0),math.sin(1),math.sin(2)}

w[1] = "anther field"

x.f = w

print(w["x"])

print(w[1])

print(x.f[1])

w.x = nil

list = nil

for line in io.lines() do

list = {next = list,value = line}

local l = list

while l do

print(l.value)

l = l.next

--error("inva operation")

--相當于do while

repeat

until line ~=""

print(line)

for i = 1,math.huge do --math.huge 無限大

print(1)

revDays = {["Sunday"] = 1,["Monday"] = 2,["Tuesday"] = 3,["Wednessday"] = 4,["Thursday"] = 5,["Friday"] = 6,["Saturday"] = 7}

x = "Tuesday"

--print(revDays[x])

table.sort(revDays)

revDays1 = {}

for k,v in pairs(revDays) do --給v指派“Sunday","Monday"... k指派1,2...

print(k)

print(v)

--數組排序

a = {1,3,2}

table.sort(a)

for i,v in pairs(a) do print(v) end

--print("Monday是第"..revDays1["Monday"].."天")

for key,value in ipairs(revDays1) do

print(revDays1[key])

a[1] = 10

a[2] = 20

a[3] = 30

day2

--函數

--數組求和

function sum(a)

local sum = 0

for i,v in pairs(a) do

sum = sum + v

return sum

a = {1,2,3,4,5,6}

num = sum(a)

print(num)

s,e = string.find("hello lua","lua")

print(s,e) --傳回函數的開始結束字元,從1開始

--傳回多個傳回值

function maximum(a)

local mi = 1

local m = a[mi]

for i,val in pairs(a) do

if val&gt; m then

mi = i;m = val

return m,mi

function maxmum(a)

local num = 1

local val = a[num]

for i,value in pairs(a) do

if value&gt;val then

num = i

val = value

return val,num

print(maxmum({8,10,23,12,5}))

t = {}

s = "from=world, to=Lua"

for k, v in string.gmatch(s, "(%w+)=(%w+)") do

t[k]=v

for k, v in pairs(t) do

print(k,v)

print({if not package.loaded["111"] then print("nil") end}

day3

--面向對象

People = {} --定義一個p表

function clone(tab)

local t = {}

for key,value in pairs(tab) do

t[key] = value

return t

function People.sayhi()

print("Hello World")

end--]]

--[[People.sayhi = function()

print("Hello People ")

function People.new(name)

local self = clone(People)

self.name = name

return self

People.sayhi = function(self)

print("Hello People "..self.name)

--[[q = clone(People)

q.sayhi()--]]

local k = People.new("丁小未")

k.sayhi(k)

k:sayhi(k)

--k.sayhi()

--繼承

function copy(dist,tab)

dist[key] = value

Man = {}

Man.new = function(name)

local self = People.new(name)

copy(self,Man)

Man.sayHello = function()

print("Man say hello")

Man.sayhi = function(self)

print("hi "..self.name)

local m= Man.new("人")

m.sayhi(m)

m:sayHello()

--m:sayhi(m)

lua不支援函數重載

--可變參數

function show(...)

local num = select('#',...)

if num&gt;0 then

print("恩")

print("無")

show()

--原表

local tbA = {a = 1}

local tbB = {b = 2}

tbA.y = function(tb, k) --必須要有傳回值

print("__index key:" .. k)

if k == 'a' then

return 10

return nil

local mt = {__index = tbA,

__newindex = function(t, k, v)

}

local mt = {__index = function(tb, k)   --這個元方法用于讀取值

end,

__newindex = function(tb, k, v)  --這個是用于設定值

print("__newindex key:" .. k)

]]

setmetatable(tbB, tbA)

tbB.a = 3

print(tbB.a)

--tbB.d = 3

--tbB.b = 5

--print(tbB.d)

繼續閱讀