1. 程式人生 > >lua 閉包 和and/or 操作符及其它的說明

lua 閉包 和and/or 操作符及其它的說明

今天發現學過的知識不常用的都忘了差不多了,這裡重新整理下,做下記錄吧

0X01 閉包

lua的閉包之前自己也研究過這裡做下記錄吧,直接上程式碼

function test()
	local i=0;
	local f=function()
				i=i+1;
				return i
			end
	return f
end
--這裡生成一個閉包f1,同時變數i也是閉包的一部分
local f1 = test()
local a = f1()
local b = f1()
--這裡再生成一個閉包f2,同時變數i也重新建立也是閉包的一部分,是和前面沒有任何關係的
local f2=test()
local c=f2() local e=f1() local d=f2() print("a:"..a.." b:"..b.." c:"..c.." d:"..d.." e:"..e)

結果: 在這裡插入圖片描述

關於閉包的應用場景,這裡沒有過多的去注意,很尷尬,至今為止可能用過沒有注意,

參考文章 深入理解Lua的閉包一:概念、應用和實現原理,關於應用還是不要參考這篇文章了,感覺不對,文章說的table.sort方法我覺得不是閉包 lua閉包全面解析 這篇有詳細說明

0X02 and/or操作符

操作符這裡有坑,之前以為和c語言類似,但今天發現不對 Lua中的邏輯運算子:與(and)、或(or)和非(not),與其他語言的邏輯運算子功能一致,這裡不做贅述。只說一點,所有的邏輯運算子將false和nil視為假,其他任何東西視為真,0也視為真。

直接上程式碼:

--and 操作符 如果前面的引數為假則直接輸出前面的值
local a = 0 and 3
local b = nil and 3
local m = false and 3
--nil和false不能直接拼接字串,所以需要先tostring
print( "a:"..a.."  b:"..tostring( b).." m:"..tostring( m))

--or 操作符 如果前面的引數為假則直接輸出後面的值
local c = 0 or 5
local d = nil or 5
local e = false or 5
local f = nil or false
print
( "c:"..c.." d:"..d.." e:"..e.." f:"..tostring(f)) if 0 then print("0 is true !") else print("0 is false") end if nil then print("nil is true !") else print("nil is false") end if false then print("false is true !") else print("false is false") end

結果: 結果

0X03 多行字串

一個字串帶換行的怎麼處理這裡說明下,使用[[ ]]來處理

local text=[[
abc
def
hello
world
]]
print(text)

在這裡插入圖片描述

0X04 lua遞迴函式

c語言允許函式內部呼叫函式本身,但lua不允許函式內部呼叫函式本身 遞迴呼叫需要先定義一個函式變數,這樣在函式內部呼叫本身的時候後能訪問到定義的函式變數地址

--一個階乘的例子
--遞迴呼叫需要先定義一個函式變數,這樣在函式內部呼叫本身的時候後能訪問到定義的變數地址
local fact
fact = function (n)
    if n == 0 then
          return 1 
     else
       return n*fact(n-1)
    end
end

--120
print(fact(5))

--錯誤的用法
local fact1 = function (n)
    if n == 0 then
          return 1 
     else
       return n*fact1(n-1)
    end
end
print(fact1(5))

結果: 在這裡插入圖片描述