码迷,mamicode.com
首页 > 其他好文 > 详细

Lua 第五章、第六章--函数

时间:2014-12-27 19:09:21      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

        在Lua中,函数是一种对语句和表达式进行抽象的主要机制。函数既可以完成某项特定的任务,也可以只做一些计算并返回结果。

        Lua具有一项非常于总不同的特征,允许函数返回多个结果:

s, e = string.find("Hello Lua users", "Lua")
print(s, e)            -->7    9

        以Lua编写的函数同样可以返回多个结果,只需在return关键字后列出所有返回值即可:

function maximum (a)
local mi = 1            --最大值的索引
local m = a[mi]         --最大值
    for i, val in ipairs(a) do
        if val > m then
            mi = i; m = val
        end
    end
return m, mi    
end

print(maximum({8, 10, 23, 12, 5})        -->23    3

        关于多重返回值还要介绍一个特殊函数--unpack。它接受一个数组作为参数,并从下标1开始返回该数组的所有元素:

print(unpack{1, 2, 3})        -->1    2    3
a, b = unpack{1, 2, 3}        -->a=1, b=2, 3被丢弃

        Lua中的函数还可以接受不同数量的实参:

function add(...)
local s = 0
for i, v in ipairs{...} do
    s = s + v
end
return s
end

print(add(3, 4, 10, 25, 12))            -->54

        参数表中的3个点(...)表示该函数可接受不同数量的实参。实际上,还可以通过变长参数来模拟Lua中普通的参数传递机制,例如:

function foo(a, b, c)
--可以转换为:
function foo(...)
local a, b, c = ...
end

        Lua提供了专门用于格式化文本(string.format)和输出文本(io.write)的函数。很自然地会想到将这两个函数合二为一:

function fwrite(fmt, ...)
return io.write(string.format(fmt, ...))
end
--调用                    参数
fwrite()                 fmt = nil,没有变长参数
fwrite("a")              fmt = "a",没有变长参数
fwrite("%d%d", 4, 5)     fmt = "%d%d",变长参数为4和5

        在Lua中,函数是一种“第一类值”,这表示在Lua中函数与其他传统类型的值具有相同的权利。函数可以存储到变量中或table中,可以作为实参传递给其他函数,还可以作为其他函数的返回值。

        在Lua中有一个容易混淆的概念是,函数与所有其他值一样都是匿名的,即它们都没有名称。当讨论一个函数名是(例如print),实际上是在讨论一个持有某函数的变量。

a = {p = print}
a.p("Hello World")        -->Hello World
print = math.sin          --‘print‘现在引用了正弦函数
a.p(print(1))             -->0.841470
sin = a.p                 --‘sin‘现在引用了print函数
sin(10, 20)               -->10    20


Lua 第五章、第六章--函数

标签:

原文地址:http://my.oschina.net/Jacedy/blog/361292

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!