lua学习笔记---4.函数

324 阅读2分钟

函数

function类型:函数类型(作为第一类值)

定义的语法:

-- function 函数名(行参表)
    -- 函数体
-- end

function sum(a,b)
    return a+b
end

local function sum(a,b)
    return a+b
end
local sum = function(a,b)
    return a+b
end

函数的特性:

支持多返回值,返回值用,隔开

  • 求一个数组中的最大值和最大值对应的下标
local getMaxValueAndIndex = function(array)
    -- 类型检测
    if type(array) ~= "table" then
        error("参数必须为table类型")
    end
    max = array[1]
    index = 1
    for i = 2,#array do
        if max < array[i] then
            max = array[i]
            index = i
        end
    end
    return max,index
end
local tb = {1, 5, 7, 4, 10 ,9 ,6}
local a = getMaxValueAndIndex(tb) -- 接收第一个返回值
local _,a = getMaxValueAndIndex(tb) -- 接收第二个返回值
print(getMaxValueAndIndex(tb))

当参数为table类型时,实参可以省略()

print(getMaxValueAndIndex{1, 3, 5, 7, 9})

Lua没有参数缺省,可以采取表达式

function test(a,b)
    -- 如果a为nil,则给赋值0
    a = a or 0
    -- 如果b为nil,则给赋值""
    b = b or ""
end

可以不定个数的参数,用 ... 表示

function printTest( ... ) --可以传不同个数个参数
    local args = { ... } -- 将所有的参数存放到表中
    print( ... )
    for i = 1,#args do
        print(args[i])
    end
end
printTest(1, 2, 3)

table中的函数

冒号与点的区别:冒号的第一个参数默认为self,self指向调用该函数

local vec2 = {x = 1, y = 2}
-- 第一种方式:求长度的方法
-- function vec2.getLength(self)
--     return math.sqrt(self.x ^ 2 + self.y ^ 2)
-- end

-- 第二种方式(:)
function vec2:getLength()
    -- 默认的第一个参数为self,self指向调用该函数的表
    return math.sqrt(self.x ^ 2 + self.y ^ 2)
end
-- 下面两者等同
print(vec2:getLength())
print(vec2.getLength(vec2))

local size = {w = 1, h = 3}
-- size:求面积和周长
function size:getArea()
    return self.w * self.h
end
function size:getPerimeter()
    return (self.w + self.h) * 2
end
print("size的面积为: " .. size:getArea())
print("size的周长为: " .. size:getPerimeter())
print("-------------------")

string的函数

for k,v in pairs(string) do
    print(k)
end

string.find():在母串中查找子串出现的起始位置和结束位置

-- 参数:1.母串 2.子串 3.查找的开始位置(可不传,默认为1)
-- 返回值:起始位置和结束位置
print(string.find("hello hello", "hel")) -- 1 3
print(string.find("hello hello", "hel", 2)) -- 7 9

string.sub():字符串截取

-- 参数:1.字符串 2.截取的起始位置 3.截取的结束位置(负数表示从后往前数)
-- 返回值:截取后的字符串
print(string.sub("abcdefg",2,-2)) --"bcdef"